【问题标题】:Pandas DataFrame: How to merge left with a second DataFrame on a combination of index and columnsPandas DataFrame:如何在索引和列的组合上与第二个 DataFrame 合并
【发布时间】:2018-10-04 00:45:48
【问题描述】:

我正在尝试合并两个数据框。

我想合并一列,即第二个 DataFrame 的 index 和 一列,即第二个 Dataframe 中的 column。两个 DataFrame 中的列/索引名称不同。

例子:

import pandas as pd

df2 = pd.DataFrame([(i,'ABCDEFGHJKL'[j], i*2 + j) 
                    for i in range(10) 
                    for j in range(10)],
                    columns = ['Index','Sub','Value']).set_index('Index')

df1 = pd.DataFrame([['SOMEKEY-A',0,'A','MORE'],
                    ['SOMEKEY-B',4,'C','MORE'],
                    ['SOMEKEY-C',7,'A','MORE'],
                    ['SOMEKEY-D',5,'Z','MORE']
                   ], columns=['key', 'Ext. Index', 'Ext. Sub', 'Description']
                  ).set_index('key')

df1 打印出来

key Ext. Index  Ext. Sub    Description
SOMEKEY-A   0   A   MORE
SOMEKEY-B   4   C   MORE
SOMEKEY-C   7   A   MORE
SOMEKEY-D   5   Z   MORE

df2 的第一行是

Index   Sub Value
0   A   0
0   B   1
0   C   2
0   D   3
0   E   4

我想将“Ext.Index”和“Ext.Sub”与DataFrame df2合并,其中索引为“Index”,列为“Sub”

预期结果是:

key Ext. Index  Ext. Sub    Description Ext. Value
SOMEKEY-A   0   A   MORE    0
SOMEKEY-B   4   C   MORE    10
SOMEKEY-C   7   A   MORE    14
SOMEKEY-D   5   Z   MORE    None

手动合并是这样的

def get_value(x):
    try:
        return df2[(df2.Sub == x['Ext. Sub']) & 
                   (df2.index == x['Ext. Index'])]['Value'].iloc[0]
    except IndexError:
        return None

df1['Ext. Value'] = df1.apply(get_value, axis = 1)

我可以使用pd.mergepd.concat 命令执行此操作吗? 通过将 df2.index 变为列来更改 df2?

【问题讨论】:

  • 我知道你说你不能把df2的索引改成一列,但是你能把索引改成包括两列吗?
  • 我正在寻找一种不需要更改索引的解决方案。我知道完整索引或列集的合并是如何工作的,我想知道是否需要更改,这是大型数据集上的内存问题。更改 df1 上的索引是可以接受的,但我希望不这样做
  • pd.merge(df1,df2, on='Index')看看怎么样
  • @pygo,目的是填充 ['Ext. df2 中的 Value'] 列,也在 df1 中,合并的“索引”列被命名为“Ext.Index”,所以这无济于事
  • 移到答案下方...

标签: python pandas dataframe


【解决方案1】:

尝试使用:

df_new = (df1.merge(df2[['Sub', 'Value']],
                    how='left',
                    left_on=['Ext. Index', 'Ext. Sub'],
                    right_on=[df2.index, 'Sub'])
          .set_index(df1.index)
          .drop('Sub', axis=1))

【讨论】:

  • 这行得通。我不知道您可以使用 df2.index 作为列名,我只需要在最后过滤列名即可获得预期结果。 df1.merge(df2, how='left', left_on=['Ext. Index', 'Ext. Sub'], right_on=[df2.index, 'Sub']).set_index(df1.index)[list(df1.columns) + ['Value']]。谢谢。
猜你喜欢
  • 2016-11-22
  • 2017-11-27
  • 1970-01-01
  • 2018-04-08
  • 2018-09-07
  • 2019-11-10
  • 2022-12-05
  • 1970-01-01
相关资源
最近更新 更多