在一个数据框中计算另一个数据框中某个项目的出现次数。

7

我目前遇到一个问题,希望有人能帮助。目前有两个数据框,每个数据框都有数十万行数据(其中一个有超过200k行,另一个有超过180k行)。其中较大的数据框将包含唯一的用户值,而较小的数据框则没有,例如:

df1:
user1
user2
user3
user4
user5

df2:
user1
user1
user5
user4
user5
user5

我需要做的是从df1中取出每个用户,高效地判断它是否存在于df2中,并统计它出现的次数。
谢谢!
3个回答

13

使用 value_counts

df1['Newcount']=df1['df1:'].map(df2['df2:'].value_counts())
df1
Out[117]: 
    df1:  Newcount
0  user1       2.0
1  user2       NaN
2  user3       NaN
3  user4       1.0
4  user5       3.0

好的解决方案 :) - jezrael
@piRSquared 谢谢您先生 : -) 你俩的评论对我来说意义重大 :-) - BENY
1
谢谢!这正是我想要的!! - Sam L
1
@SamL 你可以尝试使用 merge_asof - BENY
1
@SamL,我建议您开一个新问题,因为这个问题与当前的完全不同。 - BENY
显示剩余3条评论

2
假设每个DataFrame中相关的列名为'user',那么您可以使用:
pd.merge(
    df1,
    df2.user.groupby(df2.user).count(),
    left_on='user',
    right_index=True,
    how='left')

说明:

  • groupby + count 将找到每个用户出现的次数。它将创建一个DataFrame,其索引是用户,值是计数。

  • 合并将结果DataFrame左连接到df1上。


df1.join(df2.user.groupby(df2.user).count().rename('Count'), on='user') - piRSquared

2
使用 pd.factorizenp.bincount 来高效地生成值计数。
f, u = pd.factorize(df2.user)
d = dict(zip(u, np.bincount(f)))

df1['Counts'] = df1.user.map(d)
df1

    user  Counts
0  user1     2.0
1  user2     NaN
2  user3     NaN
3  user4     1.0
4  user5     3.0

设置

df1 = pd.Series(list('12345')).radd('user').to_frame('user')
df2 = pd.Series(list('115455')).radd('user').to_frame('user')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接