合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引
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.index
和set_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])
。检查编辑的答案。以上是关于合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引的主要内容,如果未能解决你的问题,请参考以下文章