我有一个看起来如下的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部分.
小智 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)
您可以使用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)
这是另一种选择:
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)