Python Pandas:检查同一行中另一列的字符串中是否包含一列中的字符串

swa*_*g16 19 python pandas

我有这样的数据帧:

RecID| A  |B
----------------
1    |a   | abc 
2    |b   | cba 
3    |c   | bca
4    |d   | bac 
5    |e   | abc 
Run Code Online (Sandbox Code Playgroud)

并且想要在A和B中创建另一列C,这样对于同一行,如果列A中的字符串包含在列B的字符串中,则C = True,如果不是则则C = False.

我正在寻找的示例输出是这样的:

RecID| A  |B    |C 
--------------------
1    |a   | abc |True
2    |b   | cba |True
3    |c   | bca |True
4    |d   | bac |False
5    |e   | abc |False
Run Code Online (Sandbox Code Playgroud)

有没有办法在熊猫中快速完成此操作而不使用循环?谢谢

jez*_*ael 27

你需要applyin:

df['C'] = df.apply(lambda x: x.A in x.B, axis=1)
print (df)
   RecID  A    B      C
0      1  a  abc   True
1      2  b  cba   True
2      3  c  bca   True
3      4  d  bac  False
4      5  e  abc  False
Run Code Online (Sandbox Code Playgroud)

另一个解决方案list comprehension是更快,但必须没有NaNs:

df['C'] = [x[0] in x[1] for x in zip(df['A'], df['B'])]
print (df)
   RecID  A    B      C
0      1  a  abc   True
1      2  b  cba   True
2      3  c  bca   True
3      4  d  bac  False
4      5  e  abc  False
Run Code Online (Sandbox Code Playgroud)

  • 时序测试-我在大约有9万行的数据帧上运行了此测试:lambda版本花费了9.4245秒,列表理解花费了0.0308秒。每jezrael的音符中没有警告“ NaN”。 (2认同)

Kub*_*dam 8

如果您将字符串与字符串进行比较并收到类型错误,您可以这样编写代码:

df['C'] = df.apply(lambda x: str(x.A) in str(x.B), axis=1)
Run Code Online (Sandbox Code Playgroud)


Dou*_*own 7

我无法得到 @jezreal 提供的任何一个答案来处理第一列中的 None 。对列表理解稍加修改就可以处理它:

[a in b if a is not None else False for a,b in zip(df['A'], df['B'])]
Run Code Online (Sandbox Code Playgroud)