使用groupby迭代pandas DataFrame,并根据每个组中的条件选择值

时间:2018-01-29 21:41:48

标签: python pandas for-loop dataframe

我有一个包含许多组的大型DataFrame。 我想要做的是迭代每个组,并且根据是否满足某个条件,我想总结该组的值。

我的DataFrame看起来像这样:

 Item_Num   Price_Change   Unit_Sales
 10                 True           10
 10                 False          15
 10                 False          11
 10                 False          13
 12                 True           10 
 12                 False          11
 12                 False          14
 12                 True           11
 12                 False          11

对于每组Item_Num,我想记录当该行的价格发生变化时的单位销售总和,直到另一次价格变动为止。所以,我想要这样的结果:

 0 Item_Num   Price_Change   Unit_Sales  Sum 
 1 10                 True           10   49
 2 10                 False          15  
 3 10                 False          11
 4 10                 False          13
 5 12                 True           10   34
 6 12                 False          11
 7 12                 False          14
 8 12                 True           11   22
 9 12                 False          11

(所以我通过将行1到4相加得到49的总和,通过将行5-7相加得到34的总和,并通过对行8和9求和得到和22)。

这是我到目前为止(草图):

 for name, group in new.groupby('UPC'):
     if ['Price_Change'] == True:
          sum(unit_sales until next price change)

迭代每个组的最佳方法是什么(可以改进我的方法)以及如何选择Price_Change == True的行?

1 个答案:

答案 0 :(得分:1)

非常接近您之前的问题:-)

df['New']=df.groupby([df['Item_Num'],df['Price_Change'].cumsum()])['Unit_Sales'].transform('sum')
df
Out[15]: 
   Item_Num  Price_Change  Unit_Sales  New
0        10          True          10   49
1        10         False          15   49
2        10         False          11   49
3        10         False          13   49
4        12          True          10   35
5        12         False          11   35
6        12         False          14   35
7        12          True          11   22
8        12         False          11   22
df.New=df.New.where(df['Price_Change'],'')
df
Out[17]: 
   Item_Num  Price_Change  Unit_Sales New
0        10          True          10  49
1        10         False          15    
2        10         False          11    
3        10         False          13    
4        12          True          10  35
5        12         False          11    
6        12         False          14    
7        12          True          11  22
8        12         False          11