Pandas使用groupby中的count来创建新列

GNM*_*O11 20 python pandas

我有一个看起来如下的df:

id        item        color
01        truck       red
02        truck       red
03        car         black
04        truck       blue
05        car         black
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个看起来像这样的df:

item      color       count
truck     red          2
truck     blue         1
car       black        2
Run Code Online (Sandbox Code Playgroud)

我试过了

df["count"] = df.groupby("item")["color"].transform('count')
Run Code Online (Sandbox Code Playgroud)

但它并不是我所寻找的.

任何指导表示赞赏

And*_*den 52

这不是一个新专栏,这是一个新的DataFrame:

In [11]: df.groupby(["item", "color"]).count()
Out[11]:
             id
item  color
car   black   2
truck blue    1
      red     2
Run Code Online (Sandbox Code Playgroud)

要获得您想要的结果是使用reset_index:

In [12]: df.groupby(["item", "color"])["id"].count().reset_index(name="count")
Out[12]:
    item  color  count
0    car  black      2
1  truck   blue      1
2  truck    red      2
Run Code Online (Sandbox Code Playgroud)

要获得"新列",您可以使用transform:

In [13]: df.groupby(["item", "color"])["id"].transform("count")
Out[13]:
0    2
1    2
2    2
3    1
4    2
dtype: int64
Run Code Online (Sandbox Code Playgroud)

我建议阅读文档split-apply-combine部分.

  • 我认为,“name”参数在 Python 的更高版本中已被弃用。无论如何,我收到一条错误消息。 (5认同)
  • DataFrame.reset_index() 不再支持 `name` 作为关键字参数,从 pandas 1.5.0 开始使用 `names` 代替 (2认同)

小智 13

实现所需输出的另一种可能方法是使用Named Aggregation。这将允许您为所需的输出列指定名称和相应的聚合函数。

命名聚合

0.25.0 版中的新功能。

为了通过控制输出列名称来支持特定于列的聚合,pandas 接受 中的特殊语法GroupBy.agg(),称为“命名聚合”,其中:

  • 关键字是输出列名称

  • 这些值是元组,其第一个元素是要选择的列,第二个元素是要应用于该列的聚合。Pandas 为pandas.NamedAgg命名元组提供了字段['column','aggfunc'],以便更清楚地说明参数是什么。像往常一样,聚合可以是可调用的或字符串别名。

因此,要获得所需的输出 - 您可以尝试类似...

import pandas as pd
# Setup
df = pd.DataFrame([
    {
        "item":"truck",
        "color":"red"
    },
    {
        "item":"truck",
        "color":"red"
    },
    {
        "item":"car",
        "color":"black"
    },
    {
        "item":"truck",
        "color":"blue"
    },
    {
        "item":"car",
        "color":"black"
    }
])

df_grouped = df.groupby(["item", "color"]).agg(
    count_col=pd.NamedAgg(column="color", aggfunc="count")
)
print(df_grouped)
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

             count_col
item  color
car   black          2
truck blue           1
      red            2
Run Code Online (Sandbox Code Playgroud)


rac*_*hwa 8

您可以使用value_counts该列并将其命名为reset_index

In [3]: df[['item', 'color']].value_counts().reset_index(name='counts')
Out[3]: 
    item  color  counts
0    car  black       2
1  truck    red       2
2  truck   blue       1
Run Code Online (Sandbox Code Playgroud)

  • 快速提醒一下:.reset_index() 中的参数应该是 *name* (单数),而不是名称。 (2认同)

Adr*_*ter 5

这是另一种选择:

import numpy as np
df['Counts'] = np.zeros(len(df))
grp_df = df.groupby(['item', 'color']).count()
Run Code Online (Sandbox Code Playgroud)

这导致

             Counts
item  color        
car   black       2
truck blue        1
      red         2
Run Code Online (Sandbox Code Playgroud)