我有一个4个pandas数据帧的列表,其中包含我想要合并到单个数据帧中的一天的tick数据.我无法理解concat在我的时间戳上的行为.详情如下:
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)]
Run Code Online (Sandbox Code Playgroud)
用append我得到:
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)
Run Code Online (Sandbox Code Playgroud)
用concat我得到:
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)
Run Code Online (Sandbox Code Playgroud)
请注意索引在使用时如何更改concat.为什么会发生这种情况?我将如何使用concat重现使用的结果append?(因为concat看起来快得多;每个循环24.6毫秒vs每循环3.02秒)
Moh*_*ood 49
Concat提供基于轴(所有行或所有列)的连接灵活性
追加是concat的特定情况(axis = 0,join ='outer')
Join是基于变量= ['left','right','inner','couter']的索引(由set_index设置)
合并基于两个数据框中的每一个的任何特定列,这些列是变量,如'left_on','right_on','on'
Jef*_*eff 43
所以你在做什么是附加和concat 几乎相同.区别在于空的DataFrame.由于某种原因,这会导致一个大幅放缓,不确定为什么,将不得不看一些点.下面是基本上你做了什么的娱乐.
我几乎总是使用concat(虽然在这种情况下它们是等效的,除了空框架); 如果你不使用空框架,它们将是相同的速度.
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
Run Code Online (Sandbox Code Playgroud)
Mic*_*ner 26
我已经实现了一个小基准(请在Gist上找到代码)来评估大熊猫concat和append.我在评论后更新了代码段和结果ssk08- 非常感谢!
基准测试在Mac OS X 10.13系统上运行,使用Python 3.6.2和pandas 0.20.3.
+--------+---------------------------------+---------------------------------+ | | 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; drconcat和
之间没有显着差异append.
小智 8
您必须记住的另一件事是 Pandas 中的 APPEND() 方法不会修改原始对象。相反,它使用组合数据创建一个新的。由于涉及创建和数据缓冲区,其性能不佳。进行多APPEND操作时最好使用CONCAT()函数。
| 归档时间: |
|
| 查看次数: |
73723 次 |
| 最近记录: |