[英]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.