【问题标题】:Pandas, group by count and add count to original dataframe?熊猫,按计数分组并将计数添加到原始数据帧?
【发布时间】:2021-07-01 05:05:11
【问题描述】:

当尝试计算数据框中具有相似“种类”的行时:

import pandas as pd

items = [('aaa','aaa text 1'), ('aaa','aaa text 2'), ('aaa','aaa text 3'),
         ('bb', 'bb text 1'), ('bb', 'bb text 2'), ('bb', 'bb text 3'), 
         ('bb', 'bb text 4'),
         ('cccc','cccc text 1'), ('cccc','cccc text 2'),
         ('dd', 'dd text 1'),
         ('e', 'e text 1'),
         ('fff', 'fff text 1'),
        ]

df = pd.DataFrame(items, columns=['kind', 'msg'])
df

    kind    msg
0   aaa     aaa text 1
1   aaa     aaa text 2
2   aaa     aaa text 3
3   bb      bb text 1
4   bb      bb text 2
5   bb      bb text 3
6   bb      bb text 4
7   cccc    cccc text 1
8   cccc    cccc text 2
9   dd      dd text 1
10  e       e text 1
11  fff     fff text 1

此代码有效:

df = df[['kind']].groupby(['kind'])['kind'] \
                         .count() \
                         .reset_index(name='count') \
                         .sort_values(['count'], ascending=False) \
                         .head(5)

df

导致:

    kind      count
    0   aaa   1
    1   bb    1
    2   cccc  1
    3   dd    1
    4   e     1

然而,如何获得一个包含所有列的数据框,就像原始一加“计数”列一样?所以结果应该有这样的顺序列'kind','msg','count'?

另外,如何按计数的降序对这个结果数据框进行排序?

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    IIUC

    In [247]: df['count'] = df.groupby('kind').transform('count')
    
    In [248]: df
    Out[248]:
        kind          msg  count
    0    aaa   aaa text 1      3
    1    aaa   aaa text 2      3
    2    aaa   aaa text 3      3
    3     bb    bb text 1      4
    4     bb    bb text 2      4
    5     bb    bb text 3      4
    6     bb    bb text 4      4
    7   cccc  cccc text 1      2
    8   cccc  cccc text 2      2
    9     dd    dd text 1      1
    10     e     e text 1      1
    11   fff   fff text 1      1
    

    排序:

    In [249]: df.sort_values('count', ascending=False)
    Out[249]:
        kind          msg  count
    3     bb    bb text 1      4
    4     bb    bb text 2      4
    5     bb    bb text 3      4
    6     bb    bb text 4      4
    0    aaa   aaa text 1      3
    1    aaa   aaa text 2      3
    2    aaa   aaa text 3      3
    7   cccc  cccc text 1      2
    8   cccc  cccc text 2      2
    9     dd    dd text 1      1
    10     e     e text 1      1
    11   fff   fff text 1      1
    

    【讨论】:

    • transform('count') 函数返回多个列,因此分配它不起作用。我必须指定要返回的列。 @MaxU 有什么我想念的吗?
    • @leonard,我不知道你想要实现什么以及你的数据集是什么样的。我建议您提出一个新问题并在那里指定一个小样本数据集和您想要的数据集
    • @leonard 您的问题在第二个答案中得到了准确回答
    【解决方案2】:

    这是一个简单的代码,用于计算频率并在按kind 列分组时向数据框中添加一列。

    df['count'] = df.groupby('kind')['kind'].transform('count')
    

    【讨论】:

    • 这应该被接受的答案..据我所知
    猜你喜欢
    • 2021-01-22
    • 2013-12-20
    • 2017-08-21
    • 2021-10-30
    • 2013-06-29
    • 2018-07-25
    • 2023-02-03
    相关资源
    最近更新 更多