合并数据框

0 投票
2 回答
574 浏览
提问于 2025-04-18 11:25

我有三个 pandas 数据框,它们的索引是匹配的。不过,有些操作让这些数据框的内容被删减了(去掉了一些行),所以在一个数据框中的某些索引可能在另一个数据框中找不到。

我想把这三个数据框合并在一起,让它们都包含在所有三个数据框中都有的索引对应的行。这个怎么做呢?

import pandas as pd
data = pd.DataFrame.from_dict({'a': [1,2,3,4], 'b': [3,4,5,6], 'c': [6,7,8,9]})

a = pd.DataFrame(data['a'])
b = pd.DataFrame(data['b'])
c = pd.DataFrame(data['c'])

a = a[a['a'] <= 3]
b = b[b['b'] >= 4]

# some operation here that removes rows that aren't present in all (intersection of all dataframe's indices)

print a
   a
1  2
2  3

print b
   b
1  4
2  5

print c
   c
1  7
2  8

更新

抱歉,我刚才有点激动,写例子的时候忘了我真正想要的是什么。其实我的目的是想把这三个数据框保持分开。对之前误导性的例子表示歉意(我现在已经改正了)。

2 个回答

0

看看这个concat,它可以用来做各种组合操作。在这里,你想把join类型设置为inner(因为你想要交集),并把axis设置为1(也就是合并列)。

In [123]: pd.concat([a,b,c], join='inner', axis=1)
Out[123]: 
   a  b  c
1  2  4  7
2  3  5  8
1

使用 merge 函数,并设置参数 left_index=Trueright_index=True,这样默认的合并方式就是内连接,这意味着只有在左边和右边都存在的值才会被合并。

In [6]:

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

[2 rows x 3 columns]

如果你想修改原来的数据框,使其只包含在所有数据框中都存在的行,可以这样做:

In [12]:

merged = a.merge(b, left_index=True, right_index=True).merge(c, left_index=True, right_index=True)
merged
Out[12]:
   a  b  c
1  2  4  7
2  3  5  8
In [14]:

a = a.loc[merged.index]
b = b.loc[merged.index]
c = c.loc[merged.index]
In [15]:

print(a)
print(b)
print(c)
   a
1  2
2  3
   b
1  4
2  5
   c
1  7
2  8

我们通过合并所有数据框,使用它们的索引值,这些索引值在所有数据框中都存在,然后用这个索引来过滤原来的数据框。

撰写回答