整合数据帧

时间:2014-06-28 09:14:13

标签: python pandas indexing

我有3个匹配索引的pandas数据帧。某些操作以不同的方式(删除的行)修剪数据帧,因此一个数据帧中的某些索引可能不存在于另一个数据帧中。

我想整合所有3个数据框,因此它们都包含所有3个数据中都存在索引的行。这怎么可以实现?

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

更新

抱歉,当我写完这些例子时,我被带走并忘记了我想要达到的目标。实际意图是将3个数据帧分开。为误导性的例子道歉(我现在纠正了它)。

2 个答案:

答案 0 :(得分: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

因此,我们将它们全部合并到所有索引值中,然后使用索引过滤原始数据帧。

答案 1 :(得分:0)

查看concat,它可用于各种组合操作。在这里,您希望将join类型设置为内部(因为需要交集),并将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