如何使用Python DataFrame检查B列中是否包含A列的内容?

时间:2016-04-29 15:36:38

标签: python pandas dataframe

我在pandas DataFrame中有两列:authorsname。我想创建第三列:如果相应的行True包含在相应的行name中,则单元格的值为authors,和False否则。

所以结果如下图所示。

enter image description here

我尝试了.str.contains().str.extract().str.find().where()等。 但Python返回错误:' Series'对象是可变的,因此它们不能被散列。 有谁知道如何在Python中创建第三列?

2 个答案:

答案 0 :(得分:5)

IIUC然后你可以apply逐行检查一个lambda来检查作者中是否存在Name字符串:

df['Check'] = df.apply(lambda row: row['Name'] in row['Authors'], axis=1)

应该有效

您无法在此处使用str.contains()str.extract()str.find()where(),因为您正在尝试比较行方式和方法期望搜索条件的固定列表或模式。

答案 1 :(得分:0)

这是一个矢量化解决方案,它使用Series.str.split()DataFrame.isin()方法:

df['Check'] = df.Authors.str.split(r'\s*,\s*', expand=True).isin(df.Name).any(1)

演示:

In [126]: df
Out[126]:
                 Authors     Name
0  S.Rogers, T. Williams   H. Tov
1      M. White, J.Black  J.Black

In [127]: df.Authors.str.split(r'\s*,\s*', expand=True)
Out[127]:
          0            1
0  S.Rogers  T. Williams
1  M. White      J.Black

In [128]: df.Authors.str.split(r'\s*,\s*', expand=True).isin(df.Name)
Out[128]:
       0      1
0  False  False
1  False   True

In [130]: df['Check'] = df.Authors.str.split(r'\s*,\s*', expand=True).isin(df.Name).any(1)

In [131]: df
Out[131]:
                 Authors     Name  Check
0  S.Rogers, T. Williams   H. Tov  False
1      M. White, J.Black  J.Black   True