为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2022-06-22 20:51:39
我有多个具有匹配多级索引的命名 Pandas 系列数据集SeriesA = L1 L2 L3    value_a1   L2 L3    value_a2      L3    value_a3SeriesA.name = First_NameSeriesB =L1 L2 L3    Value_b1   L2 L3    Value_b2      L3    Value_b3SeriesB.name = Second_Name我想要做的是在连接它们之前将系列名称添加到现有系列索引中。预期的输出应该是SeriesAB =L1  L2  L3 First_name    value_a1    L2  L3 First_name    value_a2        L3 First_name    value_a3L1  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_nameL1  L2  L3  value_a1    value_b1    L2  L3  value_a2    value_b2        L3  value_a3    value_b3我也想避免这个输出Unwanted =                First_Name   Second_NameL1   L2   L3   value_a1     NaN     L2   L3   value_a2     NaN          L3   value_a3     NaNL1   L2   L3   NaN          value_b1     L2   L3   NaN          value_b2          L3   NaN          value_b3 
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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)

                             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


查看完整回答
反对 回复 2022-06-22
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号