我的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')
但这不是我要找的东西。
感谢任何指导
答案 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
答案 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