我有一个形状为(696, 20531)的大型pandas数据框,我想在直方图中绘制它的所有值。使用df.plot(kind='hist')
似乎需要很长时间。有更好的方法吗?
我有一个形状为(696, 20531)的大型pandas数据框,我想在直方图中绘制它的所有值。使用df.plot(kind='hist')
似乎需要很长时间。有更好的方法吗?
DataFrame.stack()
:import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5, 10))
print(df.to_string())
0 1 2 3 4 5 6 7 8 9
0 -0.760559 0.317021 0.325524 -0.300139 0.800688 0.221835 -1.258592 0.333504 0.669925 1.413210
1 0.082853 0.041539 0.255321 -0.112667 -1.224011 -0.361301 -0.177064 0.880430 0.188540 -0.318600
2 -0.827121 0.261817 0.817216 -1.330318 -2.254830 0.447037 0.294458 0.672659 -1.242452 0.071862
3 1.173998 0.032700 -0.165357 0.572287 0.288606 0.261885 -0.699968 -2.864314 -0.616054 0.798000
4 2.134925 0.966877 -1.204055 0.547440 0.164349 0.704485 1.450768 -0.842088 0.195857 -0.448882
df.stack().hist()
random_state
),大小为n
,从您的数据框中获取。因此,您可以绘制数据的样本(例如1000个点,具有可重复的随机性)。df.sample(n=1000,random_state=1).plot()
使用Pandas绘制大型数据集总是麻烦的,因为会出现内存开销问题( 更多信息请参见)。
一种内存高效的方法是使用DuckDB。您可以将数据存储在.parquet
文件中,然后使用SQL计算直方图的区间和高度。
您可以使用以下代码片段作为模板(只需用数字值替换bin_size
):
select
floor(SOME_COLUMN/100.0)*100.0,
count(*) as count
from 'path/to/file.parquet'
group by 1
order by 1;
接下来,您可以将结果传递给matplotlib的bar函数,该函数需要bin位置和高度。
我在一个名为JupySQL的新包中实现了这个功能。它基本上是按照我描述的方式进行操作,并添加了一些额外的功能。在这里,您可以看到一个示例和一些内存基准测试,证明这种方法更加高效。