Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 整合数据帧_Python_Pandas_Indexing - Fatal编程技术网

Python 整合数据帧

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.

我有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.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(合并列)

使用并传递param
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

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

有趣的是,
merge
对于较大的数据帧比concat更快,我将concat与merge在40000行数据帧上进行了比较,发现这是
100个循环,每个循环最好3:6.3 ms
100个循环,最佳3:4.87毫秒/循环
当使用400万行数据帧比较concat和Merge时,速度更快:
1个循环,最佳3:694毫秒/循环,最佳3:494毫秒/循环
,这是使用pandas
0.14.0
concat完成的。3个数据帧有没有办法保持分开?抱歉,我搞错了这个例子。合并似乎是concat的一个有趣的替代方案。你什么时候用一个或另一个?似乎
merge
更通用。我更新了我的帖子。我装帧它的方式不是我真正想要的…@orange除非你传递param
inplace=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