【问题标题】:Pandas merge with MultiIndex for repeated columnsPandas 与 MultiIndex 合并重复列
【发布时间】:2020-11-30 00:57:17
【问题描述】:

我有两个 DataFrame,包含相同对象(人)的不同方面(左脚、右脚)的相同信息(长度、宽度)。

import pandas as pd

left_feet = pd.DataFrame(
    data={
        "Length": [20, 30, 25],
        "Width": [8, 10, 9]},
    index=[0, 1, 2])

right_feet = pd.DataFrame(
    data={
        "Length": [24, 30],
        "Width": [8, 10]},
    index=[2, 1])

print(left_feet)
   Length  Width
0      20      8
1      30     10
2      25      9

print(right_feet)
   Length  Width
2      24      8
1      30     10

我想将这些合并到一个 DataFrame 中,所以我这样做:

feet = pd.merge(left_feet, right_feet,
         left_index=True, right_index=True,
         suffixes=["_left", "_right"])

print(feet)
   Length_left  Width_left  Length_right  Width_right
1           30          10            30           10
2           25           9            24            8

但是,使用后缀很麻烦。相反,我希望列是 MultiIndex,其中第一级包含“左”和“右”,第二级包含“长度”和“宽度”。

最好的方法是什么?

注意:关于连接对齐的 DataFrames 的类似问题已经被问到,但这个问题是关于 join(即“合并”)操作的;这些行不一定是对齐的,并且可能并不总是有对应的行。

【问题讨论】:

  • 我指的是串联和合并/加入的概念,而不是pd.concat。如果concat 函数实际上可以进行连接(而不仅仅是连接),那么这是一个很好的答案。感谢您的回答,如果我需要使用 merge 函数(可能用于其他合并功能),这一点很重要。
  • 别担心,它本来可以更清楚的。我会编辑。

标签: python pandas join merge multi-index


【解决方案1】:

试试concat,带有keys参数和join='inner':

print(pd.concat([left_feet, right_feet], axis=1, keys=['Left','Right'], join='inner'))
    Left        Right      
  Length Width Length Width
1     30    10     30    10
2     25     9     24     8

【讨论】:

    【解决方案2】:

    因为需要merge或join先创建MultiIndexes再加入:

    left_feet.columns = pd.MultiIndex.from_product([['left'], left_feet.columns])
    right_feet.columns = pd.MultiIndex.from_product([['right'], right_feet.columns])
    
    feet = pd.merge(left_feet, right_feet,
             left_index=True, right_index=True)
    
    print(feet)
        left        right      
      Length Width Length Width
    1     30    10     30    10
    2     25     9     24     8
    

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 2018-07-22
      • 2017-03-13
      • 2020-06-15
      • 2018-02-03
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多