DataFrame
次のように大きいこと:
userid user_mentions
1 [2, 3, 4]
1 [3]
2 NaN
2 [1,3]
3 [1,4,5]
3 [4]
user_mentions
列はリストであるuserid
各ユーザーが言及されているの。たとえば、最初の行は次のことを意味します。
ユーザー1は、ユーザー2、3、および4について言及しています。
userid
列のユーザー間にメンションネットワークを作成する必要があります。つまり、userid
列内の各ユーザーが列内の他のユーザーによって言及された回数が必要ですuserid
。したがって、基本的に、最初に次のようなものが必要です。
filtered = df[df['user_mentions'].isin(df['userid'].unique())]
ただし、これはリストの列では機能しません。
上記の問題を解決すれば、できgroupby['userid','user_mentions']
ます。
編集
最終的な出力は次のようになります。
Source Target Number
1 2 1
1 3 2
2 1 1
2 3 1
3 1 1
3 5 1
これは、Pandas / NumPyに適したタスクではありません。したがってcollections.defaultdict
、カウントのディクショナリを作成し、ディクショナリからデータフレームを構築するために使用することをお勧めします。
from collections import defaultdict
dd = defaultdict(lambda: defaultdict(int))
for row in df.itertuples(index=False):
vals = row.user_mentions
if vals == vals:
for val in vals:
dd[row.userid][val] += 1
df = pd.DataFrame([(k, w, dd[k][w]) for k, v in dd.items() for w in v],
columns=['source', 'target', 'number'])
print(df)
source target number
0 1 2 1
1 1 3 2
2 1 4 1
3 2 1 1
4 2 3 1
5 3 1 1
6 3 4 2
7 3 5 1
もちろん、そもそもパンダシリーズにリストを載せるべきではありません。これはポインタのネストされたレイヤーであり、可能な限り避ける必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加