Return 聚合组中所有唯一的
Return aggregate for all unique in a group
问题就出在这里。
假设我们有一个 pandas df,可以使用以下方法生成:
month=['dec','dec','dec','jan','feb','feb','mar','mar']
category =['a','a','b','b','a','b','b','b']
sales=[1,10,2,5,12,4,3,1]
df = pd.DataFrame(list(zip(month,category,sales)),
columns =['month', 'cat','sales'])
print(df)
| month cat sales |
|--------------------|
| 0 dec a 1 |
| 1 dec a 10 |
| 2 dec b 2 |
| 3 jan b 5 |
| 4 feb a 12 |
| 5 feb b 4 |
| 6 mar b 3 |
| 7 mar b 1 |
那么假设我们想要按月计算每个类别的数量。
所以我们去做类似
的事情
df=df.groupby(['month','cat']).sales.sum().reset_index()
print(df)
| month cat sales |
|--------------------|
| 0 dec a 11 |
| 1 dec b 2 |
| 2 feb a 12 |
| 3 feb b 4 |
| 4 jan b 5 |
| 5 mar b 4 |
但我们希望看到的是:
| month cat sales |
|--------------------|
| 0 dec a 11 |
| 1 dec b 2 |
| 2 feb a 12 |
| 3 feb b 4 |
| 4 jan b 5 |
| 5 jan a 0 |
| 6 mar b 4 |
| 7 mar a 0 |
不同之处在于,在特定月份未出现的类别仍然会以零作为总数出现。
很可能以前有人问过这个问题,但我没找到。如果您指出问题的方向,我们将继续删除这个问题。
将MultiIndex
with reindex
用作:
df=(
df.groupby(['month','cat']).sales.sum()
.reindex(pd.MultiIndex.from_product([df.month.unique(), df.cat.unique()],
names=['month', 'cat']), fill_value=0)
.reset_index()
)
print(df)
month cat sales
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
从您停止的地方继续,stack
and unstack
的组合将为您提供所需的输出:
res = (
df.groupby(['month', 'cat'])
.sales.sum()
.unstack(fill_value=0) # Unstack and fill value for the null column
.stack() # Return to groupby form and reset
.reset_index(name='sales')
)
res
的输出:
>>> res
month cat sales
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
您还可以使用分类并将 observed
设置为 False;这将确保所有可能的组合都出现在最终输出中。
(df.astype({'month' : 'category',
'cat' : 'category'})
.groupby(['month', 'cat'],
as_index = False,
observed = False)
.sum(numeric_only = True)
)
month cat sales
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
没有 groupby
但有 pivot_table
和 stack
的另一种方式:
df_ = df.pivot_table(index='month',columns='cat',
values='sales', aggfunc=sum, fill_value=0)\
.stack().reset_index()
print (df_)
month cat 0
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
问题就出在这里。
假设我们有一个 pandas df,可以使用以下方法生成:
month=['dec','dec','dec','jan','feb','feb','mar','mar']
category =['a','a','b','b','a','b','b','b']
sales=[1,10,2,5,12,4,3,1]
df = pd.DataFrame(list(zip(month,category,sales)),
columns =['month', 'cat','sales'])
print(df)
| month cat sales |
|--------------------|
| 0 dec a 1 |
| 1 dec a 10 |
| 2 dec b 2 |
| 3 jan b 5 |
| 4 feb a 12 |
| 5 feb b 4 |
| 6 mar b 3 |
| 7 mar b 1 |
那么假设我们想要按月计算每个类别的数量。
所以我们去做类似
的事情df=df.groupby(['month','cat']).sales.sum().reset_index()
print(df)
| month cat sales |
|--------------------|
| 0 dec a 11 |
| 1 dec b 2 |
| 2 feb a 12 |
| 3 feb b 4 |
| 4 jan b 5 |
| 5 mar b 4 |
但我们希望看到的是:
| month cat sales |
|--------------------|
| 0 dec a 11 |
| 1 dec b 2 |
| 2 feb a 12 |
| 3 feb b 4 |
| 4 jan b 5 |
| 5 jan a 0 |
| 6 mar b 4 |
| 7 mar a 0 |
不同之处在于,在特定月份未出现的类别仍然会以零作为总数出现。
很可能以前有人问过这个问题,但我没找到。如果您指出问题的方向,我们将继续删除这个问题。
将MultiIndex
with reindex
用作:
df=(
df.groupby(['month','cat']).sales.sum()
.reindex(pd.MultiIndex.from_product([df.month.unique(), df.cat.unique()],
names=['month', 'cat']), fill_value=0)
.reset_index()
)
print(df)
month cat sales
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
从您停止的地方继续,stack
and unstack
的组合将为您提供所需的输出:
res = (
df.groupby(['month', 'cat'])
.sales.sum()
.unstack(fill_value=0) # Unstack and fill value for the null column
.stack() # Return to groupby form and reset
.reset_index(name='sales')
)
res
的输出:
>>> res
month cat sales
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
您还可以使用分类并将 observed
设置为 False;这将确保所有可能的组合都出现在最终输出中。
(df.astype({'month' : 'category',
'cat' : 'category'})
.groupby(['month', 'cat'],
as_index = False,
observed = False)
.sum(numeric_only = True)
)
month cat sales
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4
没有 groupby
但有 pivot_table
和 stack
的另一种方式:
df_ = df.pivot_table(index='month',columns='cat',
values='sales', aggfunc=sum, fill_value=0)\
.stack().reset_index()
print (df_)
month cat 0
0 dec a 11
1 dec b 2
2 feb a 12
3 feb b 4
4 jan a 0
5 jan b 5
6 mar a 0
7 mar b 4