Pandas,按计数分组并将计数添加到原始数据框中?

dok*_*ndr 8 dataframe pandas

尝试计算数据框中具有类似"种类"的行时:

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
Run Code Online (Sandbox Code Playgroud)

此代码有效:

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

df
Run Code Online (Sandbox Code Playgroud)

导致:

    kind      count
    0   aaa   1
    1   bb    1
    2   cccc  1
    3   dd    1
    4   e     1
Run Code Online (Sandbox Code Playgroud)

然而,如何才能获得包含所有列的数据框,如原始列和"计数"列?那么结果应该按顺序排列'kind','msg','count'列?

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

Max*_*axU 10

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
Run Code Online (Sandbox Code Playgroud)

排序:

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
Run Code Online (Sandbox Code Playgroud)

  • Transform('count') 函数返回多个列,因此分配它不起作用。我必须指定我想要返回哪一列。我有什么遗漏的吗@MaxU? (3认同)

小智 5

这是计算频率并在数据帧中添加一列的简单代码。

df['count'] = df.groupby('kind')['Kind'].transform('count')
Run Code Online (Sandbox Code Playgroud)

  • 这应该是可以接受的答案..据我所知 (3认同)