我有一个非常大(比便宜的RAM大)的CSV数据集,我正在熊猫操作现在我在做类似的事情

df = pd.read_csv('verylargefile.csv', chunksize=10000)
for df_chunk in df:
    df_chunk['new_column'] = df_chunk['old_column'].apply(my_func)
    # do other operations and filters...
    df_chunk.to_csv('processed.csv', mode='a')

所以我可以对数据集执行所需的操作,并将输出保存到另一个文件中。
问题从对这个数据集进行分组和统计开始:我需要计算整个数据集的平均值、标准差和直方图,还要绘制结果、趋势图、使用statsmodels等。因为样本不会是齐次的,所以我无法计算统计数据。
df.groupby('column_1').sum()
TypeError: Cannot groupby on a TextFileReader

我没有选择几个列的常规选项,我也看不出在hdf上存储数据有什么帮助。有办法吗?

最佳答案

这似乎是一种dask.dataframe可以提供帮助的情况下面是一个例子。
有关更多信息,请参见dask documentation和这个非常好的tutorial

In [1]: import dask.dataframe as dd

In [2]: !head data/accounts.0.csv
id,names,amount
138,Ray,1502
1,Tim,5
388,Ingrid,45
202,Zelda,1324
336,Jerry,-1607
456,Laura,-2832
65,Laura,-326
54,Yvonne,341
92,Sarah,3136

In [3]: dask_df = dd.read_csv('data/accounts.0.csv', chunkbytes=4000000)

In [4]: dask_df.npartitions
Out[4]: 4

In [5]: len(dask_df)
Out[5]: 1000000

In [6]: result = dask_df.groupby('names').sum()

In [7]: result.compute()
Out[7]:
                id    amount
names
Alice     10282524  43233084
Bob        8617531  47512276
Charlie    8056803  47729638
Dan       10146581  32513817
Edith     15164281  37806024
Frank     11310157  63869156
George    14941235  80436603
Hannah     3006336  25721574
Ingrid    10123877  54152865
Jerry     10317245   8613040
Kevin      6809100  16755317
Laura      9941112  34723055
Michael   11200937  36431387
Norbert    5715799  14482698
Oliver    10423117  32415534
Patricia  15289085  22767501
Quinn     10686459  16083432
Ray       10156429   9455663
Sarah      7977036  34970428
Tim       12283567  47851141
Ursula     4893696  37942347
Victor     8864468  15542688
Wendy      9348077  68824579
Xavier     6600945  -3482124
Yvonne     5665415  12701550
Zelda      8491817  42573021

这里是使用pandas进行比较的结果。我在这里使用的数据适合内存,但是即使数据大于内存,dask也可以工作。
In [8]: import pandas as pd

In [9]: pandas_df = pd.read_csv('data/accounts.0.csv')

In [10]: len(pandas_df)
Out[10]: 1000000

In [11]: pandas_df.groupby('names').sum()
Out[11]:
                id    amount
names
Alice     10282524  43233084
Bob        8617531  47512276
Charlie    8056803  47729638
Dan       10146581  32513817
Edith     15164281  37806024
Frank     11310157  63869156
George    14941235  80436603
Hannah     3006336  25721574
Ingrid    10123877  54152865
Jerry     10317245   8613040
Kevin      6809100  16755317
Laura      9941112  34723055
Michael   11200937  36431387
Norbert    5715799  14482698
Oliver    10423117  32415534
Patricia  15289085  22767501
Quinn     10686459  16083432
Ray       10156429   9455663
Sarah      7977036  34970428
Tim       12283567  47851141
Ursula     4893696  37942347
Victor     8864468  15542688
Wendy      9348077  68824579
Xavier     6600945  -3482124
Yvonne     5665415  12701550
Zelda      8491817  42573021

关于python - 对非常大的Pandas数据框进行汇总和统计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34106574/

10-09 17:14
查看更多