合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引

Posted

技术标签:

【中文标题】合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引【英文标题】:Merge two dataframes with different indices while preserving the main dataframe's index using a one-line code 【发布时间】:2019-05-14 18:05:15 【问题描述】:

我有两个数据框;第一个(df1)是:

df1 = pd.DataFrame('col1': [0,1], 'col2': [0,1])
df1 = df1.rename(index = k:v for k,v in zip([0,1],['zero','one']))
print(df1)
      col1  col2
zero    0   0
one     1   1

第二个(df2)是:

df2 = pd.DataFrame(k:v for k,v in zip(['col'+str(i) for i in range(3,10)],
                            [[2,3]]*7)
                            )
print(df2)
   col3  col4  col5  col6  col7  col8  col9
0     2     2     2     2     2     2     2
1     3     3     3     3     3     3     3

最终产品(df3)应该看起来完全像:

      col1  col2  col3  col4  col5  col6  col7  col8  col9
zero     0     0     2     2     2     2     2     2     2
one      1     1     3     3     3     3     3     3     3

这就是我做的方式,这对我来说有点不合常规:

df3 = df1.reset_index(drop = True)
df3 = df3.join(df2.reset_index(drop = True))
df3 = df3.rename(index = k:v for k,v in zip(df3.index,df1.index))
print(df3)

是否有任何一行代码可以完成这项工作?谢谢各位

【问题讨论】:

【参考方案1】:

您可以通过df1.indexset_index 创建df2.index,只要DataFrames 的长度必须相同:

df = df1.join(df2.set_index(df1.index))

或者:

df = pd.concat([df1, df2.set_index(df1.index)], axis=1)
print (df)
      col1  col2  col3  col4  col5  col6  col7  col8  col9
zero     0     0     2     2     2     2     2     2     2
one      1     1     3     3     3     3     3     3     3

如果两个 DataFrame 的列表长度相同,则传递嵌套列表以区分您想要传递列表,而不是列名列表(df2.set_index(L)df2.set_index(['a','b'])):

L = ['a','b']
df = pd.concat([df1.set_index([L]), df2.set_index([L])], axis=1)
print (df)
   col1  col2  col3  col4  col5  col6  col7  col8  col9
a     0     0     2     2     2     2     2     2     2
b     1     1     3     3     3     3     3     3     3

【讨论】:

谢谢@jezrael,我认为 set_index 只能在数据框中的现有列上工作。我一定对 pandas set_index 文档中缺少示例感到困惑 @mathguy - 是的,这不是set_index 的典型用法 - 显然将某些列转换为索引,如df.set_index('A'),但可以传递数组以转换所有索引值,就像我的回答一样。 同样的技术是否也适用于任何类似列表的对象,如 numpy 数组? @mathguy - 是的,但差别很小,需要.set_index([L])。检查编辑的答案。

以上是关于合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引的主要内容,如果未能解决你的问题,请参考以下文章

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

r - 合并数据帧时保留索引

在python中合并具有不同时间频率的系列/数据帧

Pandas加入(合并?)数据帧,只保留唯一的指标

使用不同的时间间隔合并并填充Pandas中的两个数据帧

合并具有非唯一索引的多个数据帧