合并数据框
我有三个 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=True
和 right_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
我们通过合并所有数据框,使用它们的索引值,这些索引值在所有数据框中都存在,然后用这个索引来过滤原来的数据框。