【问题标题】:Concatenate Pandas series and add series name to multilevel index连接 Pandas 系列并将系列名称添加到多级索引
【发布时间】:2019-10-15 08:33:50
【问题描述】:

我有多个具有匹配多级索引的命名 Pandas 系列数据集

SeriesA = 

L1 L2 L3    value_a1
   L2 L3    value_a2
      L3    value_a3

SeriesA.name = First_Name


SeriesB =

L1 L2 L3    Value_b1
   L2 L3    Value_b2
      L3    Value_b3

SeriesB.name = Second_Name

我要做的是将系列名称添加到现有系列索引中,然后再连接它们。预期的输出应该是

SeriesAB =

L1  L2  L3 First_name    value_a1
    L2  L3 First_name    value_a2
        L3 First_name    value_a3
L1  L2  L3 Second_name   value_b1
    L2  L3 Second_name   value_b2
        L3 Second_name   value_b3

我已经尝试了 pd.join、pd.merge、pd.concat 的各种方法,但名称似乎是症结所在。

这样做的目的是在将名称值转换为数据框之前合并名称值,以便数据看起来像这样。我猜 unstack 将是解决这个问题的方法。

final_data =
            First_name  Second_name
L1  L2  L3  value_a1    value_b1
    L2  L3  value_a2    value_b2
        L3  value_a3    value_b3

我也想避免这个输出

Unwanted = 
               First_Name   Second_Name
L1   L2   L3   value_a1     NaN
     L2   L3   value_a2     NaN
          L3   value_a3     NaN
L1   L2   L3   NaN          value_b1
     L2   L3   NaN          value_b2
          L3   NaN          value_b3 

【问题讨论】:

    标签: python pandas dataframe concatenation series


    【解决方案1】:

    concatSeries.reorder_levelsSeries.unstack 一起使用。

    concat 之后的级别值存在重复,因此解决方案有点复杂 - 是 GroupBy.cumcount 的必要辅助级别:

    df = (pd.concat([SeriesA, SeriesB], keys=('First_Name','Second_Name'))
            .reorder_levels([1,2,3,0])
            .to_frame('a'))
    print (df)
                                 a
    L1 L2 L3 First_Name   value_a1
             First_Name   value_a2
             First_Name   value_a3
             Second_Name  value_b1
             Second_Name  value_b2
             Second_Name  value_b3
    
    df = (df.set_index(df.groupby(df.index).cumcount(), append=True)['a']
            .unstack([3])
            .reset_index(level=3, drop=True))
    print (df)
             First_Name Second_Name
    L1 L2 L3   value_a1    value_b1
          L3   value_a2    value_b2
          L3   value_a3    value_b3
    

    如果concat 之后不重复,解决方案更简单:

    print (SeriesA)
    L1  L2  L3    value_a1
    L2  L2  L3    value_a2
    L3  L2  L3    value_a3
    Name: a, dtype: object
    
    print (SeriesB)
    L1  L2  L3    value_b1
    L2  L2  L3    value_b2
    L3  L2  L3    value_b3
    Name: a, dtype: object
    
    df = (pd.concat([SeriesA, SeriesB], keys=('First_Name','Second_Name'))
            .reorder_levels([1,2,3,0])
            .unstack())
    print (df)
             First_Name Second_Name
    L1 L2 L3   value_a1    value_b1
    L2 L2 L3   value_a2    value_b2
    L3 L2 L3   value_a3    value_b3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多