通过遍历熊猫列创建边缘列表

时间:2018-10-26 16:32:43

标签: python pandas

给出以下数据框:

User_ID Retweet_UserID
001     005
001     002
001     003
001     002
002     007
002     001
003     002

User_ID是用户标识号,Retweet_UserID是创作原始tweet的用户的User_ID。我需要在User_ID列中的用户之间创建转发网络(边缘列表)。我的意思是,我只关心转发是否在User_ID列中的两个User_ID之间。例如,用户001和用户005之间的转发对我而言并不重要,因为用户005不在User_ID列中的用户之中。因此边缘列表应如下所示:

Source  Target   Weight 
001     002      2
001     003      1
002     001      1
003     002      1

因此,基本上,我想要两件事:删除任何Target中没有Source的条目,然后您想拥有元组(Source, Target)的次数。我的数据框是如此之大,我正在寻找一种熊猫方法来快速做到这一点。

2 个答案:

答案 0 :(得分:2)

首先,您需要过滤(如Brad Solomon所指出的那样):

java.lang.ClassCastException: java.io.SequenceInputStream cannot be cast to java.lang.String

现在,您需要执行filtered = df[df['Retweet_UserID'].isin(df['User_ID'].unique())] groupby才能获得成对的人之间的转发总数:

size

然后result = filtered.rename(columns={'User_ID': 'Source', 'Retweet_UserID': 'Target'}) \ .groupby(['Source', 'Target']) \ .size() \ .reset_index(name='Weight') 是(根据您的示例):

result

答案 1 :(得分:1)

您似乎要根据Retweet_UserID是否落入User_ID的唯一ID集中来过滤行:

>>> unique = df.User_ID.unique()
>>> filt = df[df.Retweet_UserID.isin(unique)]
>>> filt
   User_ID  Retweet_UserID
1        1               2
2        1               3
4        2               1
5        3               2

如果您要创建新的指标列:

>>> import numpy as np

>>> df['Weight'] = np.where(df.Retweet_UserID.isin(unique), 1, 0)
>>> df
   User_ID  Retweet_UserID  Weight
0        1               5       0
1        1               2       1
2        1               3       1
3        2               7       0
4        2               1       1
5        3               2       1