Ale*_*ont 4 python pandas pandas-groupby
是否有一个简单的方法/模块在python中进行分组操作,数据集太大而无法放入内存中?
我通常会使用pandas,但它会因大型数据集而崩溃.
在评论中,@ steboc提到使用sqlite作为可能的解决方案.您可以使用任何数据库作为后端,但sqlite相当快,几乎不需要设置.这是一个将一堆垃圾写入sqlite然后以组的形式读回来的例子:
首先加载一些软件包并设置环境:
import pandas as pd
import sqlite3
import string
## connect to a db. This db will be created if it does not exist
conn = sqlite3.connect('example.db')
c = conn.cursor()
np.random.seed(123)
## create some random data in a pandas dataframe
n = 1000000
c = 10
Run Code Online (Sandbox Code Playgroud)
让我们循环30次,每次我们创建一个包含1mm记录,10个数字字段和一个简单字母的键的数据帧.我们将在sqlite数据库中查找该数据帧.在循环结束时,我们的数据库中将有30毫米的行.我的MBP需要大约15分钟:
%%time
for i in arange(30):
df = pd.DataFrame(np.random.randn(n, c), columns=list(map(chr, range(65, 65+c))))
df['key'] = string.ascii_letters[i]
df.to_sql(name='test_table', if_exists='append', con=conn)
Run Code Online (Sandbox Code Playgroud)
现在,如果我们要通过字段中的值对所有这些数据分组进行操作,key我们首先需要获取密钥的所有唯一值.一种方法是这样做:
%%time
keys_df = pd.read_sql(sql='SELECT DISTINCT key FROM test_table', con=conn)
keys_df
Run Code Online (Sandbox Code Playgroud)
现在我们有keys_df一个数据框,其中一列包含`key'的所有唯一值.现在我们可以遍历每个组并从数据库中仅提取该组并执行分组操作.这里的例子做了一个简单的describe():
%%time
for row in keys_df.iterrows():
tempdf = pd.read_sql(sql='SELECT * FROM test_table WHERE key=\'' + row[1][0] + '\';', con=conn)
## do anything you want with your group here.
## we'll print describe just for fun
print tempdf.describe()
print ""
Run Code Online (Sandbox Code Playgroud)
显然,在现实生活中,您将值放在数据结构中.
我希望这有助于说明如何使用sqlite和pandas迭代数据组.
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |