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

swe*_*eet 1 python bigdata pandas

我有一个大的DataFrame df,我想计算每个值.我做不到:

df = pandas.read_csv('my_big_data.csv')
values_df = df.apply(value_counts)
Run Code Online (Sandbox Code Playgroud)

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

我认为必须有可能通过块来做大块chunksize,但我看不出如何.

Jef*_*eff 5

In [9]: pd.set_option('max_rows',10)
Run Code Online (Sandbox Code Playgroud)

构造一个示例框架

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')
Run Code Online (Sandbox Code Playgroud)

Chunk读取它并.value_counts为每个块构建Concacatenate所有这些结果(所以你有一个框架,由值为计数的索引,值是计数).

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]
Run Code Online (Sandbox Code Playgroud)

然后将索引分组,将所有重复项(索引)放在一个组中.求和给出了各个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]
Run Code Online (Sandbox Code Playgroud)