我有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']
我已经找到一种获取所需输出的方法。但是,我希望了解为什么我总是会出错。
最佳答案
我认为您需要按月周期的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/