问题描述
我有下图所示的数据框。每次“项目编号”列中有新值时,我都需要“总计#”列重新启动。例如,如果索引 4 是 104430-003 的最后一次出现,那么 14 将是最后一个 'Total #',它将开始在适当的 'Bin Loc' 中重新计算 VTHY-039 的'Total #'。
一旦我弄清楚那部分,我的最后一步就是在“总#”等于或大于 PV 选择#后删除任何相同的剩余“项目编号”。
解决方法
pv['cumsum'] = pv.groupby('Item Number')['Items'].transform(pd.Series.cumsum)
pv
Item Number Bin Loc. PV Pick Items cumsum
0 104430-003 A-P28-17B 4 2 2
1 104430-003 A-P39-20B 4 4 6
2 104430-003 A-P39-20C 4 1 7
3 104430-003 A-P39-26C 4 2 9
4 104430-003 A-P40-23C 4 5 14
... ... ... ... ... ...
829 VTHY-039 A-P45-09B 1 2 36
830 VTHY-039 A-P45-13B 1 2 38
831 VTHY-039 A-P45-19B 1 2 40
832 VTHY-039 A-P45-21B 1 3 43
833 VTHY-039 A-P46-21B 1 2 45
,
您可以使用 .loc 完成所有这些工作。首先,遍历所有唯一的项目编号并使用 .loc 到 transform a subset of columns。然后使用 .loc 仅选择 Total 的行
import pandas as pd
df = pd.DataFrame({'Item Number': ['104430-003','104430-003','VTHY-039','VTHY-039'],'PV Pick': [4,4,1,1],'Items': [2,2,3]})
items = df['Item Number'].unique()
for item in items:
df.loc[df['Item Number'] == item,'Total'] = df.loc[df['Item Number'] == item,'Items'].cumsum()
df = df.loc[df['Total'] < df['PV Pick']]
在选择 Total
编辑:
要回答您的评论,您可以在循环中使用 .loc 查找“Total”>=“PV Pick”的行,使用 iloc 仅抓取第一行,并将这些值附加到 breakeven_final。然后你可以用 df_breakeven_final 连接 df。
breakeven_final = []
for item in items:
df.loc[df['Item Number'] == item,'Items'].cumsum()
breakeven = df.loc[df['Item Number'] == item].loc[df['Total'] >= df['PV Pick']].iloc[0]
breakeven_final.append(breakeven.values)
df_breakeven_final = pd.DataFrame(breakeven_final,columns=df.columns.values)
df = df.loc[df['Total'] < df['PV Pick']]
df_final = pd.concat([df,df_breakeven_final]).reset_index(drop=True)