Pandas:合并数据框并保留重复索引
我有两个数据框(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]