繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM