熊猫的条件转移操作

时间:2018-12-07 07:02:36

标签: python pandas

我有df作为

print (df)
   ACTUAL  TARGET ACTUAL_DATE  NO  YEAR
0    6385  108725    9/5/2018  36  2018
1    6385  108725    9/4/2018  36  2018
2    3251  108725    9/3/2018  36  2018
3    1793  120941    9/2/2018  35  2018
4    1037  120941    9/1/2018  35  2018
5  121127  120941   8/31/2018  35  2018
6  116232  120941   8/30/2018  35  2018
7  111820  120941   8/29/2018  35  2018
8  106402  120941   8/28/2018  35  2018

我正在寻找类似的输出

enter image description here

请注意,新列ACTUAL_SALES只是ACTUAL-ACTUAL(上一个)的区别

我尝试使用

if a['ACTUAL_DATE'].dt.month == a['ACTUAL_DATE'].shift(1).dt.month:
    a['ACTUAL_SALES'] = a['ACTUAL'] - a['ACTUAL'].shift(-1)   
else:
    a['ACTUAL_SALES'] = a['ACTUAL']
  

ValueError:系列的真值不明确。使用空   a.bool(),a.item(),a.any()或a.all()。

我也尝试过

 if a['ACTUAL_DATE'].dt.month == a['ACTUAL_DATE'].shift(1).dt.month:
    a['ACTUAL_SALES'] = a['ACTUAL'].diff(-1)  
 else:
    a['ACTUAL_SALES'] = a['ACTUAL']

我已经找到一种获得所需输出的方法。但是,我希望了解为什么我仍然会遇到错误。

1 个答案:

答案 0 :(得分:1)

我认为您需要按月周期groupby,如果用diff进行多年工作,并用fillna用原始列替换每个月的最后值,最后将列转换为整数: / p>

df['ACTUAL_DATE'] = pd.to_datetime(df['ACTUAL_DATE'], format='%m/%d/%Y')

df['ACTUAL_SALES'] = (df.groupby(df['ACTUAL_DATE'].dt.to_period('m'))['ACTUAL']
                        .diff(-1)
                        .fillna(df['ACTUAL'])
                        .astype(int))
print (df)
   ACTUAL  TARGET ACTUAL_DATE  NO  YEAR  ACTUAL_SALES
0    6385  108725  2018-09-05  36  2018             0
1    6385  108725  2018-09-04  36  2018          3134
2    3251  108725  2018-09-03  36  2018          1458
3    1793  120941  2018-09-02  35  2018           756
4    1037  120941  2018-09-01  35  2018          1037
5  121127  120941  2018-08-31  35  2018          4895
6  116232  120941  2018-08-30  35  2018          4412
7  111820  120941  2018-08-29  35  2018          5418
8  106402  120941  2018-08-28  35  2018        106402