选定范围内的 Pandas Dataframe cumsum

Pandas Dataframe cumsum on selected range

提问人:Prmake 提问时间:10/24/2023 更新时间:10/24/2023 访问量:30

问:

我有一个数据帧,如下所示。

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

这都很好,只是“数量”列中每个“部件”组的第一个值被“库存”列中的第一个值替换。

关于如何避免这种情况并将初始值保留在“数量”列中的任何建议?

Python Pandas 数据帧 cumsum

评论


答:

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