我有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


我正在寻找类似的输出

python -  Pandas 的条件转移操作-LMLPHP

请注意,新列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']


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

最佳答案

我认为您需要按月周期的groupby,如果用diff多年,并且用fillna将原始月份的每个月的最后一个值替换为,最后将列转换为整数,该方法将起作用:

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

关于python - Pandas 的条件转移操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53664746/

10-11 08:29