【问题标题】:Pandas create new column with count from groupby熊猫使用来自 groupby 的计数创建新列
【发布时间】:2020-05-01 03:20:35
【问题描述】:

我有一个如下所示的 df:

id        item        color
01        truck       red
02        truck       red
03        car         black
04        truck       blue
05        car         black

我正在尝试创建一个如下所示的 df:

item      color       count
truck     red          2
truck     blue         1
car       black        2

我试过了

df["count"] = df.groupby("item")["color"].transform('count')

但这不是我要寻找的。​​p>

感谢任何指导

【问题讨论】:

标签: python pandas


【解决方案1】:

这不是一个新列,这是一个新的 DataFrame:

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

要得到你想要的结果是使用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

要获得“新列”,您可以使用转换:

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

我推荐阅读split-apply-combine section of the docs

【讨论】:

  • 非常感谢!以前从未见过拆分应用组合页面。
  • 我认为,name 参数在更高版本的 Python 中已被弃用。无论如何,我收到了一条错误消息。
【解决方案2】:

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

命名聚合

0.25.0 版中的新功能。

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

  • 关键字是输出列名

  • 这些值是元组,其第一个元素是要选择的列,并且 第二个元素是应用于该列的聚合。熊猫 为 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)

产生以下输出:

             count_col
item  color
car   black          2
truck blue           1
      red            2

【讨论】:

    【解决方案3】:

    这是另一种选择:

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

    导致

                 Counts
    item  color        
    car   black       2
    truck blue        1
          red         2
    

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 2022-09-24
      • 2018-02-01
      • 2023-02-09
      • 1970-01-01
      相关资源
      最近更新 更多