python – 检查多个cols中的字符串是否存在,并将输出提供给pandas中的单独cols
作者:互联网
我的数据帧如下:
col1 col2 col3 col4
0 a-I - - 12.4
1 - a-I - 2.6
2 a-I - a-I 23
3 - a-I a-I 4
4 - - a-I 5
5 a-I a-I - 6.245
6 - a a 7.23
7 a a - 8
我想要的是检查每列中的I是否存在,而不是使用 – 的分割字符串生成res列.任何人都知道如何做到这一点?
预期结果如下:
col1 col2 col3 col4 res
0 a-I - - 12.4 I
1 - a-I - 2.6 I
2 a-I - a-I 23 I
3 - a-I a-I 4 I
4 - - a-I 5 I
5 a-I a-I - 6.245 I
6 - a a 7.23 -
7 a a - 8 -
解决方法:
建立
如果在DataFrame中除了str之外还有其他数据类型,则需要用df.astype(str)替换df的所有提及.
使用numpy.where和str.contains
df.assign(res=np.where(df.sum(1).str.contains('I'), 'I', '-'))
使用列表理解:
列表推导通常比内置的pandas字符串方法更快:
df.assign(res=['I' if 'I' in row else '-' for row in df.values.sum(1)])
两者都产生:
col1 col2 col3 res
0 a-I - - I
1 - a-I - I
2 a-I - a-I I
3 - a-I a-I I
4 - - a-I I
5 a-I a-I - I
6 - a a -
7 a a - -
计时
df = pd.concat([df]*5000)
%timeit ['I' if 'I' in row else '-' for row in df.values.sum(1)]
9.29 ms ± 310 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.where(df.sum(1).str.contains('I'), 'I', '-')
69.4 ms ± 2.17 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df.sum(1).str.contains('I').map({False:'-',True:'I'})
83 ms ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
标签:python,split,pandas,multiple-columns 来源: https://codeday.me/bug/20190627/1303704.html