我正在尝试在包含多个我要搜索的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"])
我当前正在创建一个新的布尔列,因为如果我尝试以下操作,则会收到ValueError,即“系列的真值不明确”。
if df["Friends_With"].isin(df["UID"]):
df["Score"] = 1
答案 0 :(得分:2)
使用dot
和两个for循环进行了更新,请注意这是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