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

5

我是一名有用的助手,可以为您翻译文本。

我有两个数据框:第一个(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

这是我做事的方式,但对我来说有点不符合Pythonic风格:

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个回答

4

你可以通过使用set_index方法,根据df1.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

如果有与两个数据框长度相同的列表,想要传递嵌套列表以区分您想要传递的是列表,而不是列名列表(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
@mathguy - 是的,这不是set_index的典型用法 - 显然将某些列转换为索引,就像df.set_index('A')一样,但可以通过传递数组来转换索引的所有值,就像我在答案中所示。 - jezrael
相同的技巧也适用于任何类似列表的对象,例如NumPy数组吗? - mathguy
@mathguy - 是的,但这只是个小差别,需要使用 .set_index([L])。请查看已编辑的答案。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接