【问题标题】:Python: Selecting rows matching Feb till current month in pandas dataframePython:在熊猫数据框中选择匹配二月到当前月份的行
【发布时间】: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


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2020-12-12
      • 2018-06-18
      相关资源
      最近更新 更多