猿问

连接 Pandas 系列并将系列名称添加到多级索引

我有多个具有匹配多级索引的命名 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 


慕娘9325324
浏览 130回答 1
1回答

GCT1015

concat与Series.reorder_levels和一起使用Series.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)                             aL1 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_b3df = (df.set_index(df.groupby(df.index).cumcount(), append=True)['a']        .unstack([3])        .reset_index(level=3, drop=True))print (df)         First_Name Second_NameL1 L2 L3   value_a1    value_b1      L3   value_a2    value_b2      L3   value_a3    value_b3如果解决方案更简单后不重复concat:print (SeriesA)L1  L2  L3    value_a1L2  L2  L3    value_a2L3  L2  L3    value_a3Name: a, dtype: objectprint (SeriesB)L1  L2  L3    value_b1L2  L2  L3    value_b2L3  L2  L3    value_b3Name: a, dtype: objectdf = (pd.concat([SeriesA, SeriesB], keys=('First_Name','Second_Name'))        .reorder_levels([1,2,3,0])        .unstack())print (df)         First_Name Second_NameL1 L2 L3   value_a1    value_b1L2 L2 L3   value_a2    value_b2L3 L2 L3   value_a3    value_b3
随时随地看视频慕课网APP

相关分类

Python
我要回答