Pandas:合并数据框并保留重复索引

13 投票
2 回答
28389 浏览
提问于 2025-04-18 12:50

我有两个数据框(dataframe),我想把它们按列拼接在一起(也就是横着拼),并且希望使用内连接的方式。一个数据框里有一些重复的索引,但这些行的数据并不重复,我不想丢失这些数据:

df1 = pd.DataFrame([{'a':1,'b':2},{'a':1,'b':3},{'a':2,'b':4}],
                   columns = ['a','b']).set_index('a')

df2 = pd.DataFrame([{'a':1,'c':5},{'a':2,'c':6}],columns = ['a','c']).set_index('a')

>>> df1
   b
a   
1  2
1  3
2  4
8  9

>>> df2
   c
a   
1  5
2  6

默认情况下,concat的行为是用NaN来填充缺失的值:

>>> pd.concat([df1,df2])
    b   c
a
1   2 NaN
1   3 NaN
2   4 NaN
1 NaN   5
2 NaN   6

我想保留第一个数据框中的重复索引,并用第二个数据框中的重复值来填充它们,但在pandas 0.13.1版本中,按列进行内连接会出错。在更新版本的pandas中,concat可以实现我想要的效果:

>>> pd.concat([df1, df2], axis=1, join='inner')
   b  c
a      
1  2  5
1  3  5
2  4  6

那么,达到我想要的结果的最佳方法是什么呢?有没有使用groupby的解决方案?或者我根本就不应该使用concat

2 个回答

0

我又回到这个话题,因为我在找如何合并名字不同的列并保留重复项的方法:

df1 = pd.DataFrame([{'a':1,'b':2},{'a':1,'b':3},{'a':2,'b':4}],
                   columns = ['a','b'])
df1
   a  b
0  1  2
1  1  3
2  2  4

df2 = pd.DataFrame([{'c':1,'d':5},{'c':2,'d':6}],
                   columns = ['c','d'])
df2
   c  d
0  1  5
1  2  6

我发现 pd.merge(df1, df2.set_index('c'), left_on='a', right_index=True) 可以做到这一点:

df3
   a  b  d
0  1  2  5
1  1  3  5
2  2  4  6

如果列名相同(就像提问者的例子那样),你也可以用 .set_index('a'), left_on='a'

8

你可以进行合并,并设置参数来使用左边和右边的索引:

In [4]:    
df1.merge(df2, left_index=True, right_index=True)
Out[4]:
   b  c
a      
1  2  5
1  3  5
2  4  6

[3 rows x 2 columns]

连接应该是可以的,这对我有效:

In [5]:

pd.concat([df1,df2], join='inner', axis=1)
Out[5]:
   b  c
a      
1  2  5
1  3  5
2  4  6

[3 rows x 2 columns]

撰写回答