Python:在数据帧中选择与当前月份匹配的行

Python:在数据帧中选择与当前月份匹配的行,python,pandas,dataframe,pivot-table,pandas-groupby,Python,Pandas,Dataframe,Pivot Table,Pandas Groupby,我有以下数据帧: 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 Act

我有以下数据帧:

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   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 
    
在这里,我从Feb:Current Month(在本例中是June)开始按月对行进行过滤,然后分组查找每个模式的所有名称。(例如: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   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   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_表使用这种格式:

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)
  • 在Pandas中,使用pivot_table转换表数据(行变为列)
  • 确保使用reset_index()将透视对象转换为数据帧
根据示例数据集,此代码给出了您要查找的结果:

lstAllMonths=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
curMth = datetime.today().month  # 7=July
curMth = 6  # Jun for testing
lstMth = lstAllMonths[1:curMth]

df = df[df['Month'].isin(lstMth)][['Name1','Name2','Mode','Value1','Value2']]
gb = df.groupby(['Name1','Name2','Mode'])
dfagg = gb.agg({'Value1':sum, 'Value2':sum})

dfpvt = pd.pivot_table(dfagg,index=['Name1', 'Name2'], 
                      columns=['Mode'],
                      values=['Value1', 'Value2'], 
                      aggfunc=np.sum, fill_value=0).reset_index().rename_axis(1)
                      
dfpvt.columns=['Name1','Name2','Actual_Value1','Plan_Value1','Actual_Value2','Plan_Value2']
dfpvt.replace(0,'', inplace=True)
dfpvt = dfpvt[['Name1','Name2','Actual_Value1','Actual_Value2','Plan_Value1','Plan_Value2']]    
print(dfpvt)