Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python DataFrame检查列A的内容是否包含在列B中?_Python_Pandas_Dataframe - Fatal编程技术网

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

如何使用Python DataFrame检查列A的内容是否包含在列B中?,python,pandas,dataframe,Python,Pandas,Dataframe,熊猫数据框中有两列:authors和name。我想创建第三列:如果相应行的名称包含在相应行的作者中,则单元格的值为真,否则为假 因此,结果将如下图所示 我试过.str.contains(),.str.extract(),.str.find(),.where(),等等。 但是Python返回一个错误:“Series”对象是可变的,因此不能对它们进行散列。 有人知道如何在Python中创建第三列吗?IIUC然后可以按lambda行检查名称字符串是否存在于Authors中: df['Check']

熊猫数据框中有两列:
authors
name
。我想创建第三列:如果相应行的
名称
包含在相应行的
作者
中,则单元格的值为
,否则为

因此,结果将如下图所示

我试过
.str.contains()
.str.extract()
.str.find()
.where()
,等等。 但是Python返回一个错误:“Series”对象是可变的,因此不能对它们进行散列。 有人知道如何在Python中创建第三列吗?

IIUC然后可以按lambda行检查名称字符串是否存在于Authors中:

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


您不能在此处使用
str.contains()
str.extract()
str.find()
,或
where()
,因为您试图按行比较,而这些方法需要一个固定的搜索条件列表或模式。

这是一个矢量化解决方案,它使用以下方法:

演示:


是的,你是对的,你的建议解决了我的问题。非常感谢你@苏珊如果回答了这个问题,请考虑点击选中的标记/滴答到左边的答案,把它变成绿色。这标志着问题已解决,您感到满意,并奖励您和回答者。@MattDMo,非常感谢您的建议。这是我第一次在stackoverflow上发帖,我不太熟悉如何使用它。谢谢提醒@EdChum Hi Ed,我刚刚发现以下方法也有效,我只想与您分享:):df['Check']=map((lambda x,y:x in y),df['Name'],df['Authors']),在Python 2中是的,这会起作用。它可能会更快,因为map是作为cython for循环实现的
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