包含以定界符分隔的数字的列上的Pandas isin()

时间:2019-05-29 18:15:08

标签: python pandas

我正在尝试在包含多个我要搜索的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

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