[英]Pandas isin() on column containing numbers separated by delimiters
我正在尝试在包含要搜索的多个UID的列上运行isin()。 我想搜索由定界符(;)分隔的数字。
我提供了数据框的示例。
import pandas as pd
import numpy as np
Data = {'UID': ['13', '234', '130', '1245', '1423', '321'],
'Name': ['Bill', 'Bob', 'Joe', 'Tim', 'Rick', 'Mike'],
'Score': ['1', '0', '0', '0', '1', '0'],
'Friends_With': ['80', np.nan, '13;234', '1423;180;908', '130', '2345']}
df = pd.DataFrame(Data, columns= ['UID', 'Name', 'Score', 'Friends_With'])
“ Friends_With”字段包含每个人的UID。 我能够搜索Bill,Rick和Mike的“ Friends_With”,因为他们在“ Friends_With”字段中只有一个UID。 但是,我想看看乔和蒂姆的朋友们。 Joe在他的“ Friends_With”列中有2个UID,而Mike有3个UID。
我的最终目标是,如果“得分”为0的个人(Person1)与“得分”为1的另一个个人(Person2)成为朋友,我希望将Person1的“得分”更改为1而不是0。
这是我尝试过的代码,适用于“ Friends_With”列中只有一个UID的情况。
df["Friendship Score"] = df["Friends_With"].isin(df["UID"])
我当前正在创建一个新的Boolean列,因为如果按照下面的方法尝试某些操作,则会出现ValueError:“系列的真值不明确。”
if df["Friends_With"].isin(df["UID"]):
df["Score"] = 1
编辑:当数据集为数百万行时,解决此问题的正确方法是什么?
使用带有两个for循环的dot
更新,请注意这是o(nm)检查
s=np.array([[y in x for y in df.UID ]for x in df.Friends_With.fillna('No').str.split(';')]).dot(df.Score.astype(int))
df.loc[s==1,'Score']=s[s==1]
df
Out[201]:
UID Name Score Friends_With
0 13 Bill 1 80
1 234 Bob 0 NaN
2 130 Joe 1 13;234
3 1245 Tim 1 1423;180;908
4 1423 Rick 1 130
5 321 Mike 0 2345
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.