Python 整合数据帧
我有3个索引匹配的熊猫数据帧。某些操作以不同的方式修剪数据帧(删除行),因此一个数据帧中的某些索引可能不存在于另一个数据帧中 我想合并所有3个数据帧,以便它们都包含包含索引的行,这些索引在所有3个数据帧中都存在。这是如何实现的Python 整合数据帧,python,pandas,indexing,Python,Pandas,Indexing,我有3个索引匹配的熊猫数据帧。某些操作以不同的方式修剪数据帧(删除行),因此一个数据帧中的某些索引可能不存在于另一个数据帧中 我想合并所有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.
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
将熊猫作为pd导入
data=pd.DataFrame.from_dict({'a':[1,2,3,4],'b':[3,4,5,6],'c':[6,7,8,9]})
a=pd.DataFrame(数据['a'])
b=pd.DataFrame(数据['b'])
c=pd.DataFrame(数据['c'])
a=a[a['a']=4]
#此处的某些操作删除所有数据帧索引中不存在的行(所有数据帧索引的交点)
打印
A.
1 2
2 3
打印b
B
1 4
2 5
打印c
C
1 7
2 8
更新
对不起,当我写这些例子时,我忘乎所以,忘记了我想要达到的目标。实际目的是将3个数据帧分开。为这个误导性的例子道歉(我现在已经更正了)。看一看,它可以用于各种组合操作。在这里,您需要将join
类型设置为internal(因为用户希望相交),并将轴设置为1(合并列)
使用并传递paramleft_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
因此,我们将它们合并到所有数据帧中存在的索引值上,然后使用索引过滤原始数据帧。有趣的是,merge
对于较大的数据帧比concat更快,我将concat与merge在40000行数据帧上进行了比较,发现这是100个循环,每个循环最好3:6.3 ms
100个循环,最佳3:4.87毫秒/循环
当使用400万行数据帧比较concat和Merge时,速度更快:1个循环,最佳3:694毫秒/循环,最佳3:494毫秒/循环
,这是使用pandas0.14.0
concat完成的。3个数据帧有没有办法保持分开?抱歉,我搞错了这个例子。合并似乎是concat的一个有趣的替代方案。你什么时候用一个或另一个?似乎merge
更通用。我更新了我的帖子。我装帧它的方式不是我真正想要的…@orange除非你传递paraminplace=True
,否则原始数据帧在这里不会被触碰,因此会返回一份副本抱歉,如果仍然不清楚的话。实际上,我想更改原始数据帧(或拥有它们的副本)。它们应该只包含索引出现在所有3个数据帧中的行。
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