Pandas DataFrame concat vs append
У меня есть список из 4 pandas данных, содержащих день данных тика, которые я хочу объединить в один кадр данных. Я не могу понять поведение 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)]
Используя 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)
Используя 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)
Обратите внимание, как изменяется индекс при использовании concat
. Почему это происходит и как я могу использовать concat
для воспроизведения результатов, полученных с помощью append
? (Так как concat
кажется намного быстрее, 24,6 мс за цикл против 3.02 с за цикл)
Ответы
Ответ 1
Итак, что вы делаете, с append и 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
Ответ 2
Pandas concat Vs append Vs присоединяются против слияния
-
Concat дает гибкость объединения на основе оси (все строки или все столбцы)
-
Append - это особый случай (axis = 0, join = 'external') concat
-
Присоединение основывается на индексах (устанавливаемых set_index) на том, как переменная = ['left', 'right', 'inner', 'couter']
-
Слияние основывается на любом конкретном столбце каждого из двух информационных фреймов, эти столбцы являются переменными, такими как 'left_on', 'right_on', 'on'
Ответ 3
Я реализовал крошечную точку отсчета (пожалуйста, найти код на 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; dr Нет значительной разницы между concat
и append
.
Ответ 4
Еще одна вещь, которую вы должны иметь в виду, что метод APPEND() в Pandas не изменяет исходный объект. Вместо этого он создает новый с объединенными данными. Из-за использования создания и буфера данных его производительность не очень хорошая. Вам лучше использовать функцию CONCAT() при выполнении операций с несколькими APPEND.