提问人:Prmake 提问时间:10/24/2023 更新时间:10/24/2023 访问量:30
选定范围内的 Pandas Dataframe cumsum
Pandas Dataframe cumsum on selected range
问:
我有一个数据帧,如下所示。
Part Quantity Inventory
AAA -1 8
AAA -1 NaN
AAA -5 NaN
AAA 10 NaN
AAA -3 NaN
BBB 5 8
BBB -3 NaN
BBB -3 NaN
BBB 5 NaN
BBB -3 NaN
我有以下代码将 NaN 值替换为“数量”列中的累积总和,并且起始值是“库存”中的第一个非 NaN:
df.loc[~df['Inventory'].isna(), 'Quantity'] = df['Inventory']
mask = ~df['Inventory'].isna()
group = mask.cumsum()
df['Inventory'] = df.groupby(group)['Quantity'].cumsum()
df.loc[mask, 'Inventory'] = df['Quantity']
这给了我结果:
Part Quantity Inventory
AAA 8 8
AAA -1 7
AAA -5 2
AAA 10 12
AAA -3 9
BBB 7 7
BBB -3 4
BBB -3 1
BBB 5 6
BBB -3 3
这都很好,只是“数量”列中每个“部件”组的第一个值被“库存”列中的第一个值替换。
关于如何避免这种情况并将初始值保留在“数量”列中的任何建议?
答:
2赞
mozway
10/24/2023
#1
重写逻辑以避免修改原始列:
mask = ~df['Inventory'].isna()
group = mask.cumsum()
df.loc[~mask, 'Inventory'] = (df['Inventory'].fillna(df['Quantity'])
.groupby(group).cumsum())
输出:
Part Quantity Inventory
0 AAA -1 8.0
1 AAA -1 7.0
2 AAA -5 2.0
3 AAA 10 12.0
4 AAA -3 9.0
5 BBB 5 8.0
6 BBB -3 5.0
7 BBB -3 2.0
8 BBB 5 7.0
9 BBB -3 4.0
评论