关于python:Pandas DataFrame concat vs append

Pandas DataFrame concat vs append

我有一个4个pandas数据帧的列表,其中包含我想要合并到单个数据帧中的一天的tick数据。 我无法理解concat在我的时间戳上的行为。 详情如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
data

[<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 35228 entries, 2013-03-28 00:00:07.089000+02:00 to 2013-03-28 18:59:20.357000+02:00
Data columns:
Price       4040  non-null values
Volume      4040  non-null values
BidQty      35228  non-null values
BidPrice    35228  non-null values
AskPrice    35228  non-null values
AskQty      35228  non-null values
dtypes: float64(6),
<class 'pandas.core.frame.DataFrame'>

DatetimeIndex: 33088 entries, 2013-04-01 00:03:17.047000+02:00 to 2013-04-01 18:59:58.175000+02:00
Data columns:
Price       3969  non-null values
Volume      3969  non-null values
BidQty      33088  non-null values
BidPrice    33088  non-null values
AskPrice    33088  non-null values
AskQty      33088  non-null values
dtypes: float64(6),
<class 'pandas.core.frame.DataFrame'>

DatetimeIndex: 50740 entries, 2013-04-02 00:03:27.470000+02:00 to 2013-04-02 18:59:58.172000+02:00
Data columns:
Price       7326  non-null values
Volume      7326  non-null values
BidQty      50740  non-null values
BidPrice    50740  non-null values
AskPrice    50740  non-null values
AskQty      50740  non-null values
dtypes: float64(6),
<class 'pandas.core.frame.DataFrame'>

DatetimeIndex: 60799 entries, 2013-04-03 00:03:06.994000+02:00 to 2013-04-03 18:59:58.180000+02:00
Data columns:
Price       8258  non-null values
Volume      8258  non-null values
BidQty      60799  non-null values
BidPrice    60799  non-null values
AskPrice    60799  non-null values
AskQty      60799  non-null values
dtypes: float64(6)]

使用append我得到:

1
2
3
4
5
6
7
8
9
10
11
12
pd.DataFrame().append(data)

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 179855 entries, 2013-03-28 00:00:07.089000+02:00 to 2013-04-03 18:59:58.180000+02:00
Data columns:
AskPrice    179855  non-null values
AskQty      179855  non-null values
BidPrice    179855  non-null values
BidQty      179855  non-null values
Price       23593  non-null values
Volume      23593  non-null values
dtypes: float64(6)

使用concat我得到:

1
2
3
4
5
6
7
8
9
10
11
12
pd.concat(data)

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 179855 entries, 2013-03-27 22:00:07.089000+02:00 to 2013-04-03 16:59:58.180000+02:00
Data columns:
Price       23593  non-null values
Volume      23593  non-null values
BidQty      179855  non-null values
BidPrice    179855  non-null values
AskPrice    179855  non-null values
AskQty      179855  non-null values
dtypes: float64(6)

请注意使用concat时索引的更改方式。 为什么会发生这种情况?如何使用concat重现使用append获得的结果? (因为concat看起来要快得多;每个循环24.6毫秒vs每循环3.02秒)


所以你在做什么是附加和concat几乎相同。区别在于空的DataFrame。由于某种原因,这会导致一个大幅放缓,不确定为什么,将不得不看一些点。下面是基本上你做了什么的娱乐。

我几乎总是使用concat(虽然在这种情况下它们是等效的,除了空框架);
如果你不使用空框架,它们将是相同的速度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
In [17]: df1 = pd.DataFrame(dict(A = range(10000)),index=pd.date_range('20130101',periods=10000,freq='s'))

In [18]: df1
Out[18]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 10000 entries, 2013-01-01 00:00:00 to 2013-01-01 02:46:39
Freq: S
Data columns (total 1 columns):
A    10000  non-null values
dtypes: int64(1)

In [19]: df4 = pd.DataFrame()

The concat

In [20]: %timeit pd.concat([df1,df2,df3])
1000 loops, best of 3: 270 us per loop

This is equavalent of your append

In [21]: %timeit pd.concat([df4,df1,df2,df3])
10 loops, best of

 3: 56.8 ms per loop


Pandas concat Vs追加Vs加入Vs合并

  • Concat提供基于轴(所有行或所有列)的连接灵活性

  • 追加是concat的特定情况(axis = 0,join ='outer')

  • Join是基于变量= ['left','right','inner','couter']的索引(由set_index设置)

  • 合并基于两个数据框中的每一个的任何特定列,这些列是变量,如'left_on','right_on','on'


我已经实现了一个小基准(请在Gist上找到代码)来评估pandas'concatappend。我在ssk08评论后更新了代码段和结果 - 非常感谢!

基准测试在Mac OS X 10.13系统上运行,使用Python 3.6.2和pandas 0.20.3。

1
2
3
4
5
6
7
8
9
10
11
+--------+---------------------------------+---------------------------------+
|        | ignore_index=False              | ignore_index=True               |
+--------+---------------------------------+---------------------------------+
| size   | append | concat | append/concat | append | concat | append/concat |
+--------+--------+--------+---------------+--------+--------+---------------+
| small  | 0.4635 | 0.4891 | 94.77 %       | 0.4056 | 0.3314 | 122.39 %      |
+--------+--------+--------+---------------+--------+--------+---------------+
| medium | 0.5532 | 0.6617 | 83.60 %       | 0.3605 | 0.3521 | 102.37 %      |
+--------+--------+--------+---------------+--------+--------+---------------+
| large  | 0.9558 | 0.9442 | 101.22 %      | 0.6670 | 0.6749 | 98.84 %       |
+--------+--------+--------+---------------+--------+--------+---------------+

使用ignore_index=False append稍快一些,ignore_index=True concat略快一些。

TL;博士
concatappend之间没有显着差异。


还有一件事你必须记住,Pandas中的APPEND()方法不会修改原始对象。相反,它会创建一个包含组合数据的新组件。由于涉及创建和数据缓冲,其性能不佳。在进行多APPEND操作时,最好使用CONCAT()函数。