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

18

尝试在数据框中计算具有相似“kind”的行时:

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

然而,如何获取一个包含原始数据框中所有列以及“count”列的数据框?因此结果应该按照“kind”、“msg”、“count”的顺序具有这三列。

另外,如何将结果数据框按计数降序排序?

3个回答

18

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

3
transform('count')函数返回了多列数据,所以进行赋值操作没有成功。我必须指定我想要返回哪一列。@MaxU,我是否漏掉了什么? - leonard
@leonard,我不知道你想要实现什么以及你的数据集是什么样子的。我建议你提出一个新问题,并在那里指定一个小样本数据集和你所需的数据集。 - MaxU - stand with Ukraine
@leonard,你的问题在第二个答案中得到了确切的回答。 - shantanu pathak

15

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

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

3
根据我的了解,这应该被接受为答案。 - shantanu pathak

0

这也可以作为链的一部分来实现

df.assign(
  count=lambda x: x.groupby('kind')['kind'].transform('count')
)

如果你已经有一个链接表达式,或者你需要将带有额外列的数据框传递给函数,但又不想覆盖数据框,那么这将非常有用。


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