【问题标题】:Merging and sum up several value-counts series in Pandas在 Pandas 中合并和总结几个 value-counts 系列
【发布时间】:2015-02-05 20:39:35
【问题描述】:

我通常使用value_counts() 来获取某个值的出现次数。但是,我现在处理大型数据库表(无法将其完全加载到 RAM 中)并在 1 个月内查询数据。

有没有办法存储value_counts() 的结果并将其与/添加到下一个结果中?

我想计算用户操作的数量。假设以下结构 用户活动日志:

# month 1
id    userId     actionType
1     1          a
2     1          c
3     2          a
4     3          a
5     3          b

# month 2
id    userId     actionType
6     1          b
7     1          b
8     2          a
9     3          c

在这些产品上使用value_counts():

# month 1
userId
1       2
2       1
3       2

# month 2
userId
1       2
2       1
3       1

预期输出:

# month 1+2
userId
1       4
2       2
3       3

到目前为止,我只是找到了一个使用 groupby 和 sum 的方法:

# count users actions and remember them in new column
df1['count'] = df1.groupby(['userId'], sort=False)['id'].transform('count')
# delete not necessary columns
df1 = df1[['userId', 'count']]
# delete not necessary rows
df1 = df1.drop_duplicates(subset=['userId'])

# repeat
df2['count'] = df2.groupby(['userId'], sort=False)['id'].transform('count')
df2 = df2[['userId', 'count']]
df2 = df2.drop_duplicates(subset=['userId'])

# merge and sum up
print pd.concat([df1,df2]).groupby(['userId'], sort=False).sum()

pythonic/pandas 高效合并多个系列(和数据帧)信息的方式是什么?

【问题讨论】:

    标签: python pandas count


    【解决方案1】:

    让我建议“添加”并将填充值指定为 0。与之前建议的答案相比,这具有优势,因为当两个 Dataframe 具有不同的唯一键集时,它将起作用。

    # Create frames
    df1= pd.DataFrame({'User_id': ['a','a','b','c','c','d'],'a':[1,1,2,3,3,5]})
    df2= pd.DataFrame({'User_id': ['a','a','b','b','c','c','c'],'a' [1,1,2,2,3,3,4]})
    

    现在添加两组 values_counts()。 fill_value 参数将处理可能出现的任何 NaN 值,在此示例中,出现在 df1 中的“d”,但不是 df2。

    a = df1.User_id.value_counts()
    b = df2.User_id.value_counts()
    a.add(b,fill_value=0)
    

    【讨论】:

    • 此答案适用于具有 Nan 值的数据框。 JAB 的回答没有,即使 dropNa 为真。
    【解决方案2】:

    可以直接对value_counts方法生成的series求和:

    #create frames
    df= pd.DataFrame({'User_id': ['a','a','b','c','c'],'a':[1,1,2,3,3]})
    df1= pd.DataFrame({'User_id': ['a','a','b','b','c','c','c'],'a':[1,1,2,2,3,3,4]})
    

    总结系列:

    df.User_id.value_counts() + df1.User_id.value_counts()
    

    输出:

    a    4
    b    3
    c    5
    dtype: int64
    

    【讨论】:

      【解决方案3】:

      这称为“拆分-应用-合并”。它使用 lambda 函数在 1 行和 3-4 次点击中完成,如下所示。

      1️⃣ 将此粘贴到您的代码中:

      df['total_for_this_label'] = df.groupby('label', as_index=False)['label'].transform(lambda x: x.count())
      

      2️⃣ 将 3x label 替换为您正在计算其值的列的名称(区分大小写)

      3️⃣ 打印 df.head() 以检查它是否正常工作

      【讨论】:

        猜你喜欢
        • 2021-08-25
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 2018-12-20
        • 2022-01-23
        • 2016-11-24
        • 2017-11-19
        相关资源
        最近更新 更多