在pandas中将多索引与单索引数据帧合并

19 python pandas

我有两个数据帧.df1是多索引的:

                value
first second    
a     x         0.471780
      y         0.774908
      z         0.563634
b     x         -0.353756
      y         0.368062
      z         -1.721840
Run Code Online (Sandbox Code Playgroud)

和df2:

      value
first   
a     10
b     20
Run Code Online (Sandbox Code Playgroud)

如何将两个数据框仅与一个多索引合并,在这种情况下是"第一个"索引?期望的输出是:

                value1      value2
first second    
a     x         0.471780    10
      y         0.774908    10
      z         0.563634    10
b     x         -0.353756   20
      y         0.368062    20
      z         -1.721840   20
Run Code Online (Sandbox Code Playgroud)

And*_*den 15

你可以使用get_level_values:

firsts = df1.index.get_level_values('first')
df1['value2'] = df2.loc[firsts].values
Run Code Online (Sandbox Code Playgroud)

注意:你几乎join这里做(除了df1是MultiIndex)...所以可能有一种更简洁的方式来描述这个......

.

在一个例子中(类似于你所拥有的):

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234],
                    ['a', 'y', 0.451], ['b', 'x', 0.453]],
                   columns=['first', 'second', 'value1']
                   ).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10],['b', 20]],
                   columns=['first', 'value']).set_index(['first'])

firsts = df1.index.get_level_values('first')
df1['value2'] = df2.loc[firsts].values

In [5]: df1
Out[5]: 
              value1  value2
first second                
a     x        0.123      10
      x        0.234      10
      y        0.451      10
b     x        0.453      20
Run Code Online (Sandbox Code Playgroud)

  • 你*几乎*可以像这样合并: `df1.merge(df2, left_on=df1.index.get_level_values('first'), right_on=df2.index.get_level_values('first'))` (3认同)
  • 从 v.0.23 开始,可以使用 `left_on='name_of_index_level'`;IOW,@AndyHayden 的例子简化为`df1.merge(df2, left_on='first', right_on='first')`。 (3认同)
  • @Axel 在遵循您的建议时,我似乎失去了其他索引级别。但我正在与 `how="left"` 合并,所以为了避免这种影响,我只存储原始索引,然后分配它 `df_merged.index = index`。由于 `how="left"`,新索引和旧索引将始终具有相同的长度。 (3认同)

Mat*_*t M 9

根据文档,从pandas 0.14开始,您可以简单地加入单索引和多索引数据帧.它将匹配公共索引名称.该how参数按预期工作与'inner''outer',但有趣的是它似乎是颠倒的'left''right'(可能这是一个错误?).

df1 = pd.DataFrame([['a', 'x', 0.471780], ['a','y', 0.774908], ['a', 'z', 0.563634],
                    ['b', 'x', -0.353756], ['b', 'y', 0.368062], ['b', 'z', -1.721840],
                    ['c', 'x', 1], ['c', 'y', 2], ['c', 'z', 3],
                   ],
                   columns=['first', 'second', 'value1']
                   ).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10], ['b', 20]],
                   columns=['first', 'value2']).set_index(['first'])

print(df1.join(df2, how='inner'))
                value1  value2
first second                  
a     x       0.471780      10
      y       0.774908      10
      z       0.563634      10
b     x      -0.353756      20
      y       0.368062      20
      z      -1.721840      20
Run Code Online (Sandbox Code Playgroud)