我在pandas DataFrame中有两列:authors
和name
。我想创建第三列:如果相应的行True
包含在相应的行name
中,则单元格的值为authors
,和False
否则。
所以结果如下图所示。
我尝试了.str.contains()
,.str.extract()
,.str.find()
,.where()
等。
但Python返回错误:' Series'对象是可变的,因此它们不能被散列。
有谁知道如何在Python中创建第三列?
答案 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