如何使用 groupby 调整 pandas 中的小计列?
Posted
技术标签:
【中文标题】如何使用 groupby 调整 pandas 中的小计列?【英文标题】:how to adjust subtotal columns in pandas using grouby? 【发布时间】:2021-04-26 08:32:51 【问题描述】:我正在使用数据框连接将数据框导出到 Excel。
但是,在加入数据框之后, 使用groupby计算小计时,执行下图。
索引列中有一个“小计”字样。
enter image description here
有什么办法可以把它移到代码列中,并对索引进行排序?
enter image description here
这里代码:
def subtotal(df__, str):
container = []
for key, group in df__.groupby(['key']):
group.loc['subtotal'] = group[['quantity', 'quantity2', 'quantity3']].sum()
container.append(group)
df_subtotal = pd.concat(container)
df_subtotal.loc['GrandTotal'] = df__[['quantity', 'quantity2', 'quantity3']].sum()
print(df_subtotal)
return (df_subtotal.to_excel(writer, sheet_name=str))
【问题讨论】:
【参考方案1】:使用np.where()
将code
列中的NaN 填充为df.index
中的值。然后给df.index
分配一个新的索引数组。
import numpy as np
df['code'] = np.where(df['code'].isna(), df.index, df['code'])
df.index = np.arange(1, len(df) + 1)
print(df)
code key product quntity1 quntity2 quntity3
1 cs01767 a apple-a 10 0 10.0
2 Subtotal NaN NaN 10 0 10.0
3 cs0000 b bannana-a 50 10 40.0
4 cs0000 b bannana-b 0 0 0.0
5 cs0000 b bannana-c 0 0 0.0
6 cs0000 b bannana-d 80 20 60.0
7 cs0000 b bannana-e 0 0 0.0
8 cs01048 b bannana-f 0 0 NaN
9 cs01048 b bannana-g 0 0 0.0
10 Subtotal NaN NaN 130 30 100.0
11 cs99999 c melon-a 50 10 40.0
12 cs99999 c melon-b 20 20 0.0
13 cs01188 c melon-c 10 0 10.0
14 Subtotal NaN NaN 80 30 50.0
15 GrandTotal NaN NaN 220 60 160.0
【讨论】:
以上是关于如何使用 groupby 调整 pandas 中的小计列?的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas 如何将 groupby 操作结果分配回父数据框中的列?
pandas如何使用groupby [duplicate]将NaN值替换为平均值