合并具有可变列名称的DataFrame中的两个列

时间:2019-04-01 15:54:25

标签: python pandas dataframe

编辑我的原始帖子,希望可以简化我的问题...我正在将多个DataFrame合并为SomeData.DataFrame,这给了我以下内容:

     Key     2019-02-17    2019-02-24_x    2019-02-24_y    2019-03-03
0    A        80           NaN             NaN              80                         
1    B        NaN          NaN             45               36         
2    C        44           NaN             39              NaN            
3    D        80           NaN             NaN              12                         
4    E        49            2              NaN             NaN              

我现在要做的是有效地合并以“ _x”和“ _y”结尾的列,同时将其他所有内容都保留在原处,以便得到:

     Key     2019-02-17    2019-02-24     2019-03-03
0    A        80           NaN             80                         
1    B        NaN          45              36         
2    C        44           39              NaN            
3    D        80           NaN             12                         
4    E        49            2              NaN              

我要解决的另一个问题是SomeData.DataFrame中包含的数据每周更改一次,因此我的列标题是不可预测的。意思是,有些星期我可能根本没有上述问题,而其他星期可能有多个实例,例如:

     Key  2019-02-17  2019-02-24_x  2019-02-24_y  2019-03_10_x  2019-03-10_y  
  0   A       80           NaN          NaN           80          NaN   
  1   B       NaN          NaN           45           36          NaN              
  2   C       44           NaN           39          NaN           12   
  3   D       80           NaN          NaN           12          NaN                
  4   E       49            2           NaN          NaN           17

因此,期望的结果将是:

     Key  2019-02-17  2019-02-24   2019-03_10   
  0   A       80           NaN          80            
  1   B       NaN          45           36                       
  2   C       44           39           12   
  3   D       80           NaN          12                          
  4   E       49            2           17    

我要问的是合理的吗?还是我正在冒险超越熊猫的极限?我找不到任何人试图做类似的事情,所以我不确定。先感谢您!

1 个答案:

答案 0 :(得分:0)

已编辑问题的答案:

df = df.set_index('Key')
df.groupby(df.columns.str.split('_').str[0], axis=1).sum()

输出:

         2019-02-17  2019-02-24  2019-03-03
    Key                                    
    A          80.0         0.0        80.0
    B           0.0        45.0        36.0
    C          44.0        39.0         0.0
    D          80.0         0.0        12.0
    E          49.0         2.0         0.0

Second dataframe Output:

df.groupby(df.columns.str.split('_').str[0], axis=1).sum()

Output:

     2019-02-17  2019-02-24  2019-03-10
Key                                    
A          80.0         0.0        80.0
B           0.0        45.0        36.0
C          44.0        39.0        12.0
D          80.0         0.0        12.0
E          49.0         2.0        17.0

You could try something like this:

    df_t = df.T
    df_t.set_index(df_t.groupby(level=0).cumcount(), append=True)\
        .unstack().T\

    .sort_values(df.columns[0])[df.columns.unique()]\
    .reset_index(drop=True)

输出:

  val03-20 03-20 val03-24 03-24
0        a     1        d     5
1        b     6        e     7
2        c     4        f    10
3      NaN   NaN        g     5
4      NaN   NaN        h     6
5      NaN   NaN        i     1