【发布时间】:2020-11-10 00:48:34
【问题描述】:
我有以下数据框:
Name1 Name2 Month Mode Value1 Value2
A N Sep Plan 9 9
B N Nov Plan 6 6
B N Jan Plan 6 6
C N Feb Actual 4 4
C N Jul Actual 3 3
D N May Plan 2 2
E N Apr Actual 6 6
F N Feb Actual 7 7
E N May Actual 4 4
F N Jun Plan 3 3
<+ 100 more rows>
考虑当前月份为六月,预期输出如下:
Name1 Name2 Mode Value1 Value2
C N Actual 4 4
D N Plan 2 2
E N Actual 10 10
F N Actual 7 7
F N Plan 3 3
在这里,我从二月:当前月份(在本例中为六月)开始按月过滤行,然后按模式分组以查找所有名称一次。 (例如:F 将只为实际一次,一次为计划)
我之前尝试过对列进行转置,然后使用下面的方法总结当前月份的数据:
df = pd.DataFrame({'Name1':df['Name1'], 'previous_mt':df.loc[:,prev_month], 'current_mt':df.loc[:,this_month]})
在哪里:
prev = curr_month.replace(day=1) - timedelta(days=1)
prev_month = prev.strftime("%B")[:3]
curr_month = dt.datetime.now()
this_month = curr_month.strftime("%B")[:3]
但这变得非常复杂,因为实际数据有很多很多的模式和多年的数据。是否有任何更简单的解决方案可以避免这种复杂性并且可以实现类似的解决方案?
最后我希望有以下数据框:
Name1 Name2 Actual_Value1 Actual_Value2 Plan_Value1 Plan_Value1
C N 4 4
D N 2 2
E N 10 10
F N 7 7 3 3
我想我可以在 pandas 中使用 pivot_table 获得这种格式:
df=pd.pivot_table(df_input,index=['Name1', 'Name2'],
columns=['Mode'],
values=['Value1', 'Value2'],
aggfunc=np.sum, fill_value=0).reset_index().rename_axis(1)
【问题讨论】:
标签: python pandas dataframe pivot-table pandas-groupby