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

时间:2015-04-24 00:03:00

标签: python pandas

我的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')

但这不是我要找的东西。

感谢任何指导

3 个答案:

答案 0 :(得分:46)

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

function createCSV(name, data1, data2)
fileId = fopen(path/to/file.csv, 'w');
[x, y] = size(data);

for i = 1:x
    for j = 1:y
        fprintf(fileId, num2str(data(x, y)));
        fprintf(fileId, ',');
    end
    fprintf(fileId, num2str(data2(x)));
    fprintf(fileId, '\n');
end

end

要获得所需的结果,请使用In [11]: df.groupby(["item", "color"]).count() Out[11]: id item color car black 2 truck blue 1 red 2

reset_index

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

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

我建议您阅读split-apply-combine section of the docs

答案 1 :(得分:3)

获得所需输出的另一种可能方法是使用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

答案 2 :(得分:0)

这是另一种选择:

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