3 回答
TA贡献1851条经验 获得超3个赞
这不是一项非常适合 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
当然,您不应该首先将列表放在 Pandas 系列中。这是一个嵌套的指针层,应该尽可能避免。
TA贡献1840条经验 获得超5个赞
根据您的编辑,我将不得不同意@jpp。
对于您的(未经编辑的)原始问题,在收集每个用户的提及次数方面,您可以执行以下操作:
df['counts'] = df['userid'].apply(lambda x: df['user_mentions'].dropna().sum().count(x))
df[['userid','counts']].groupby('userid').first()
产量:
counts
userid
1 2
2 1
3 3
TA贡献1809条经验 获得超8个赞
这是一种方法。
# Remove the `NaN` rows
df = df.dropna()
# Construct a new DataFrame
df2 = pd.DataFrame(df.user_mentions.tolist(),
index=df.userid.rename('source')
).stack().astype(int).to_frame('target')
# Groupby + size
df2.groupby(['source', 'target']).size().rename('counts').reset_index()
source target counts
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
添加回答
举报