gpt4 book ai didi

python - 根据另一列是否包含列表中的名称在 Pandas 中设置一列

转载 作者:行者123 更新时间:2023-12-04 03:35:52 25 4
gpt4 key购买 nike

我一直在为这个问题苦苦挣扎,所以我想是时候问一问了。

我有一个名字列表:

names = ["john", "sally", "tom"]

我有一个 df,其中一列是 actionaction 有很多不同的东西,例如:

  • “和汤姆一起去散步”
  • “带莎莉去商店”
  • ...

我想创建一个名为 partner 的新列,并将其设置为 action 中的名称。我已经设置了该列,它已填充一些日志,但不是全部。

我试过:

for name in names:
df['partner'] = np.where(df.action.str.contains(name), name, df['partner'] )

但是我得到这个错误:

TypeError: first argument must be string or compiled pattern

我的做法是否正确?有一个更好的方法吗?任何帮助将不胜感激。

编辑:要制作我的 df 样本,您可以使用:

names = ["john", "sally", "tom"]
d = {'name': ['mark','rick','mark','jon', 'lenny'], 'action': ['Went for a walk with tom', 'Took sally to the store', 'Went for a walk with john', 'Went racing with tom and lost', 'Took john to the store'],
'partner': ['tom', '', 'john', '', 'john']}
df = pd.DataFrame(data=d)
df

“名称”列表包含字符串中所有可能的名称,因此我认为最简单的方法是找到字符串中的名称并将其设置到合作伙伴列。

这是我得到的完整错误:


TypeError                                 Traceback (most recent call last)
<ipython-input-68-ed79b0ff06a7> in <module>()
11
12 for partner in partners:
---> 13 EscrowLogs.loc[EscrowLogs.action.str.contains(partner), 'partner'] = partner
14
15

~\Anaconda3\lib\site-packages\pandas\core\strings.py in contains(self, pat, case, flags, na, regex)
2415 def contains(self, pat, case=True, flags=0, na=np.nan, regex=True):
2416 result = str_contains(self._data, pat, case=case, flags=flags, na=na,
-> 2417 regex=regex)
2418 return self._wrap_result(result)
2419

~\Anaconda3\lib\site-packages\pandas\core\strings.py in str_contains(arr, pat, case, flags, na, regex)
385 flags |= re.IGNORECASE
386
--> 387 regex = re.compile(pat, flags=flags)
388
389 if regex.groups > 0:

~\Anaconda3\lib\re.py in compile(pattern, flags)
232 def compile(pattern, flags=0):
233 "Compile a regular expression pattern, returning a Pattern object."
--> 234 return _compile(pattern, flags)
235
236 def purge():

~\Anaconda3\lib\re.py in _compile(pattern, flags)
283 return pattern
284 if not sre_compile.isstring(pattern):
--> 285 raise TypeError("first argument must be string or compiled pattern")
286 p = sre_compile.compile(pattern, flags)
287 if not (flags & DEBUG):

TypeError: first argument must be string or compiled pattern

最佳答案

我需要一个可验证的数据样本来确定,但使用 bool 索引应该可行:

for name in names:
df.loc[df.action.str.contains(name), 'partner'] = name

关于python - 根据另一列是否包含列表中的名称在 Pandas 中设置一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66926058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com