3 回答
TA贡献1880条经验 获得超4个赞
用于围绕 delimiterSeries.str.split拆分列,然后使用列表理解压缩拆分列并处理值:string|zipoccurence
df['string'] = ['|'.join(s[i:]) for i, s in zip(df['occurrence'], df['string'].str.split('|'))]
结果:
print(df)
occurrence string
0 7 8|9|10|11|12
1 2 12.2|13.6|14.7
2 0 1|2|3
3 3 4|5|6|7|8
4 4 5|6.2|7|8.1
5 0 1|2|3|4|5
性能(使用 测量timeit):
df.shape
(60000, 2)
%%timeit -n10
_ = ['|'.join(s[i:]) for i, s in zip(df['occurrence'], df['string'].str.split('|'))]
67.9 ms ± 2.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit -n10 (using 'apply')
_ = df.apply(lambda x: '|'.join(x['string'].split('|')[x.occurrence:]), axis=1)
1.93 s ± 34.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
TA贡献1712条经验 获得超3个赞
尝试将您的 lambda 表达式更改为:
df.apply(lambda x: '|'.join(x['string'].split('|')[x.occurrence:]), axis=1)
如果你想要后面的元素(右侧),你应该从出现作为索引开始。
结果:
0 8|9|10|11|12
1 12.2|13.6|14.7
2 1|2|3
3 4|5|6|7|8
4 5|6.2|7|8.1
5 1|2|3|4|5
TA贡献1842条经验 获得超21个赞
一种有点非正统的方法:从中构建一个正则表达式df['occurrence']并使用它来匹配:
df['regex'] = df['occurrence'].map(lambda o: '^' + r'(?:[^|]*\|)'*o + r'(.*)$')
df['regex']
0 ^(?:[^|]*\|)(?:[^|]*\|)(?:[^|]*\|)(?:[^|]*\|)(...
1 ^(?:[^|]*\|)(?:[^|]*\|)(.*)$
2 ^(.*)$
3 ^(?:[^|]*\|)(?:[^|]*\|)(?:[^|]*\|)(.*)$
4 ^(?:[^|]*\|)(?:[^|]*\|)(?:[^|]*\|)(?:[^|]*\|)(...
5 ^(.*)$
Name: regex, dtype: object
现在只适用re.match于每一行:
df.apply(lambda row: re.match(row['regex'], row['string']).group(1), axis=1)
0 8|9|10|11|12
1 12.2|13.6|14.7
2 1|2|3
3 4|5|6|7|8
4 5|6.2|7|8.1
5 1|2|3|4|5
dtype: object
添加回答
举报