有没有更简单的方法来合并来自多个 DataFrame 块的 describe() 结果?
Posted
技术标签:
【中文标题】有没有更简单的方法来合并来自多个 DataFrame 块的 describe() 结果?【英文标题】:Is there a simpler way to merge results of describe() from multiple chunks of a DataFrame? 【发布时间】:2020-06-15 08:39:08 【问题描述】:我正在处理一个大型 csv 文件。由于内存限制,我无法同时将整个 csv 文件导入数据帧,因此我使用块来处理数据。
df = pd.read_csv(filepath, chunksize = chunksize)
for chunk in df:
print(chunk['col2'].describe())
这给了我每个块的统计数据。有没有办法合并每个要合并的 chunk.describe() 调用的结果,以便我可以一次获取所有数据的统计信息?
我现在能想到的唯一方法是维护一个字典来存储统计信息并在每次迭代时更新。
【问题讨论】:
您可以从块中聚合整个 DataFrame 的某些统计信息,例如mean
、max
、min
和 count
s,但我认为您无法获得类似 25th 的信息块统计的百分位数。
dask
包装 pandas 以进行核外(内存太大)计算。它原生实现describe
:docs.dask.org/en/latest/…
【参考方案1】:
已编辑:
我不得不玩弄这个。我是新来的,所以请谨慎对待:
使用远程源加载示例
import pandas as pd
df1_iter = pd.read_csv("https://gist.githubusercontent.com/seankross/a412dfbd88b3db70b74b/raw/5f23f993cd87c283ce766e7ac6b329ee7cc2e1d1/mtcars.csv",
chunksize=5,
iterator=True)
对每个块做一个简单的for
查找.describe
和.T
并将其附加到列表中
接下来在df_list
上使用pd.concat()
df_list = []
for chunk in df1_iter:
df_list.append(chunk.describe().T)
df_concat = pd.concat(df_list)
分组
对于agg
,我使用了我认为有用的功能,根据需要进行调整。
desc_df = df_concat.groupby(df_concat.index).agg(
'mean':'mean',
'std': 'std',
'min': 'min',
'25%': 'mean',
'50%': 'mean',
'75%': 'mean',
'max': 'max'
)
print(desc_df)
mean std min 25% 50% 75% max
am 0.433333 0.223607 0.000 0.333333 0.500000 0.500000 1.000
carb 3.100000 1.293135 1.000 2.250000 2.666667 4.083333 8.000
cyl 6.200000 0.636339 4.000 5.500000 6.000000 7.166667 8.000
disp 232.336667 40.954447 71.100 177.216667 195.233333 281.966667 472.000
drat 3.622833 0.161794 2.760 3.340417 3.649167 3.849583 4.930
gear 3.783333 0.239882 3.000 3.541667 3.916667 3.958333 5.000
hp 158.733333 44.053017 52.000 124.416667 139.333333 191.083333 335.000
mpg 19.753333 2.968229 10.400 16.583333 20.950000 23.133333 33.900
qsec 17.747000 0.868257 14.500 16.948333 17.808333 18.248333 22.900
vs 0.450000 0.102315 0.000 0.208333 0.416667 0.625000 1.000
wt 3.266900 0.598493 1.513 2.850417 3.042500 3.809583 5.424
我希望这会有所帮助。
【讨论】:
这很有帮助,但由于 next() 可能由于内存使用而不断出错。File "pandas\_libs\parsers.pyx", line 890, in pandas._libs.parsers.TextReader.read (pandas\_libs\parsers.c:10862) File "pandas\_libs\parsers.pyx", line 912, in pandas._libs.parsers.TextReader._read_low_memory (pandas\_libs\parsers.c:11138)
。试图找出一种方法来启动用于描述的数据帧,而不使用next
来避免这种情况。
我的例子既简单又小。你的文件有多大?
文件大小为 348MB。
这不是内存问题,我使用next
的方式是在没有剩余块时抛出异常。你的方法有效。谢谢@Ukrainian-serge以上是关于有没有更简单的方法来合并来自多个 DataFrame 块的 describe() 结果?的主要内容,如果未能解决你的问题,请参考以下文章