我有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
我正在寻找类似的输出
请注意,新列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']
我已经找到一种获得所需输出的方法。但是,我希望了解为什么我仍然会遇到错误。
答案 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