【问题标题】:Count occurrences of item in one dataframe in another计算一个数据框中项目在另一个数据框中的出现次数
【发布时间】:2018-05-11 13:32:05
【问题描述】:

我目前遇到问题,希望有人能提供帮助。目前有 2 个数据框的项目,这些数据框长达数十万行。 (一个超过 200k,一个超过 180k)。 2 个数据帧中较大的将包含用户的唯一值,而较小的则不包含,例如:

df1:
user1
user2
user3
user4
user5

df2:
user1
user1
user5
user4
user5
user5

我需要做的是从 df1 中获取每个用户并有效地查看它是否在 df2 中以及它出现了多少次。

谢谢!

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用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
    

    【讨论】:

    • 很好的解决方案:)
    • @piRSquared 谢谢先生 :-) 你的两个评论对我来说意义重大:-)
    • 谢谢!这正是我想要的!
    • @SamL 你可以试试merge_asof
    • @SamL 还有,我建议打开一个新问题,因为这个问题与当前问题完全不同
    【解决方案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')
    

    【讨论】:

      【解决方案3】:

      假设每个DataFrame中的相关列名为'user',则可以使用

      pd.merge(
          df1,
          df2.user.groupby(df2.user).count(),
          left_on='user',
          right_index=True,
          how='left')
      

      解释:

      • groupby + count 将查找每个用户的出现次数。它将创建一个DataFrame,其index为user,value为count。

      • 合并将生成的 DataFrame 左合并到 df1

      【讨论】:

      • df1.join(df2.user.groupby(df2.user).count().rename('Count'), on='user')
      猜你喜欢
      • 2021-09-17
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多