繁体   English   中英

plot 一个非常大的 pandas dataframe 的最佳方法是什么?

[英]What's the best way to plot a very large pandas dataframe?

我有一个大的 pandas dataframe 形状(696、20531),我想在直方图中使用 plot 的所有值。 使用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()

直方图

另一种方法是使用DataFrame.sample() -它从您的数据帧中提供一个大小为n的随机集(带有种子random_state )。 这样就可以绘制数据的样本(例如1000个点,具有可重复的随机性),例如

df.sample(n=1000,random_state=1).plot()

使用 pandas 绘制大型数据集总是很麻烦,因为 memory 开销( 更多信息在这里)。

一种节省内存的方法是使用DuckDB 您可以将数据存储在.parquet文件中,然后使用 SQL 计算直方图的 bin 和高度。

您可以使用以下代码段作为模板(只需将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 的栏function,它获取 bin 位置和高度。

我在一个名为JupySQL的新 package 中实现了这一点。 它本质上是在做我所描述的一些额外的事情。 在这里,您可以看到一个示例和一些 memory 基准测试,证明这种方法效率更高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM