如何最佳绘制一个非常大的 Pandas 数据框?

8

我有一个形状为(696, 20531)的大型pandas数据框,我想在直方图中绘制它的所有值。使用df.plot(kind='hist')似乎需要很长时间。有更好的方法吗?


也许你可以减少数据框的大小。或者你需要在一个图中绘制696个直方图? - Anton Protopopov
我需要在一个图中绘制该数据框中的所有值,而不将每一行视为单独的直方图。 - jp89
3个回答

4
使用 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()

Histogram


这代表什么? - kilojoules
@kilojoules 这是数据框中所有值的直方图。 - Stop harming Monica

1
另一种方法是使用 DataFrame.sample() - 它提供了一个随机生成的集合(带有种子random_state),大小为n,从您的数据框中获取。因此,您可以绘制数据的样本(例如1000个点,具有可重复的随机性)。
df.sample(n=1000,random_state=1).plot()

0

使用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的新包中实现了这个功能。它基本上是按照我描述的方式进行操作,并添加了一些额外的功能。在这里,您可以看到一个示例和一些内存基准测试,证明这种方法更加高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接