给出以下数据框:
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)
的次数。我的数据框是如此之大,我正在寻找一种熊猫方法来快速做到这一点。
答案 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