使用pandas的块数据库块的值计数

时间:2014-09-24 14:42:50

标签: python pandas bigdata

我有一个很大的DataFrame df,我想计算每个值。我不能这样做:

df = pandas.read_csv('my_big_data.csv')
values_df = df.apply(value_counts)

因为它是一个非常大的数据库。

我认为必须可以通过chunksize块来实现这一点,但我看不出如何。

1 个答案:

答案 0 :(得分:5)

In [9]: pd.set_option('max_rows',10)

构建示例框架

In [10]: df = DataFrame(np.random.randint(0,100,size=100000).reshape(-1,1))

In [11]: df
Out[11]: 
        0
0      50
1      35
2      20
3      66
4       8
...    ..
99995  51
99996  33
99997  43
99998  41
99999  56

[100000 rows x 1 columns]

In [12]: df.to_csv('test.csv')

Chunk读取它并为每个块构造.value_counts 将所有这些结果连接起来(所以你有一个框架,由值为计数的索引,值是计数)。

In [13]: result = pd.concat([ chunk.apply(Series.value_counts) for chunk in pd.read_csv('test.csv',index_col=0,chunksize=10000) ] )

In [14]: result
Out[14]: 
      0
18  121
75  116
39  116
55  115
60  114
..  ...
88   83
8    83
56   82
76   76
18   73

[1000 rows x 1 columns]

然后将索引分组,该索引将所有重复项(索引)放在一个组中。求和给出了各个value_counts的总和。

In [15]: result.groupby(result.index).sum()
Out[15]: 
       0
0   1017
1   1015
2    992
3   1051
4    973
..   ...
95  1014
96   949
97  1011
98   999
99   981

[100 rows x 1 columns]