我有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个数据帧分开。为误导性的例子道歉(我现在纠正了它)。
答案 0 :(得分: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
因此,我们将它们全部合并到所有索引值中,然后使用索引过滤原始数据帧。
答案 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