有没有更简单的方法来合并来自多个 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 的某些统计信息,例如 meanmaxmincounts,但我认为您无法获得类似 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() 结果?的主要内容,如果未能解决你的问题,请参考以下文章

比这更简单的方法来展平或合并 php 数组?

如何将多个数据视图合并为一个?

WPF/XAML:使用相同事件的多个控件 - 有没有更简单的方法?

如何使用任何编程语言组合来自序列的多个图像?

vba-多个工作簿合并方法1(用到了数组)

将来自多个 API 端点的数据合并到一个数据库中