3

我使用熊猫来处理数据。我喜欢这种方法,因为在 pandas 中操作数据非常容易(选择行、添加行、删除列、分组依据、连接表等)。

我的问题是,如果数据量很大,pandas 是否也是一个好方法。特别是我担心修改和提取数据。在我可以修改数据或从数据中提取某些内容之前,我需要从文件中读取(加载)数据,然后,在完成我想做的事情(选择或修改)之后,我需要将数据保存回文件中。恐怕数据的这种“加载”和“保存”对于大数据来说可能会很慢。通过大量数据,我了解数亿行。

特别是,我的问题是熊猫是否可以用作数据库的替代品(例如 SQLite 或 MySQL)。或者,与在保存为文件的相应数据框中查找相同行相比,使用 MySQL 的 python 接口在巨大的表(保存在 MySQL 数据库中)中查找特定行会更快吗?

4

1 回答 1

6

由于 pandas 0.10.1 可以使用 HDFStore 预选磁盘:

import pandas as pd
import numpy.random as rd

df = pd.DataFrame(rd.randn(int(1e6)).reshape(int(1e5), 10), columns=list('abcdefghij'))
store = pd.HDFStore('newstore.h5')

# only data columns can serve as indices to select for on-disk, but there's a 
# speed penalty involved, so it's a conscious decision what becomes data_column!
store.append('df', df, data_columns=['a','b'])

以下事情发生在“磁盘上”(并且非常酷!;)

In [14]: store.select('df', ['a > 0', 'b > 0'])
Out[14]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 24747 entries, 2 to 99998
Data columns:
a    24747  non-null values
b    24747  non-null values
c    24747  non-null values
d    24747  non-null values
e    24747  non-null values
f    24747  non-null values
g    24747  non-null values
h    24747  non-null values
i    24747  non-null values
j    24747  non-null values
dtypes: float64(10)

In [15]: store.select('df', ['a > 0'])
Out[15]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 50043 entries, 0 to 99999
Data columns:
a    50043  non-null values
b    50043  non-null values
c    50043  non-null values
d    50043  non-null values
e    50043  non-null values
f    50043  non-null values
g    50043  non-null values
h    50043  non-null values
i    50043  non-null values
j    50043  non-null values
dtypes: float64(10)

因此,您现在要做的就是增加数据框的维度数量,并亲自查看它是否足够快以满足您的需求。这很容易玩!

于 2013-03-01T02:15:52.567 回答