串联熊猫系列并将系列名称添加到多级索引

时间:2019-10-15 08:33:50

标签: python pandas dataframe concatenation series

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

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 

1 个答案:

答案 0 :(得分: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