Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从数据帧中保存的分组数据高效地创建大量直方图_Python_Performance_Numpy_Pandas_Histogram - Fatal编程技术网

Python 从数据帧中保存的分组数据高效地创建大量直方图

Python 从数据帧中保存的分组数据高效地创建大量直方图,python,performance,numpy,pandas,histogram,Python,Performance,Numpy,Pandas,Histogram,我想从pandas dataframe中的分组数据创建一组直方图。这里有一个类似的问题。要生成与我正在使用的非常相似的玩具数据,可以使用以下代码: from pandas import DataFrame import numpy as np x = ['A']*300 + ['B']*400 + ['C']*300 y = np.random.randn(1000) df = DataFrame({'Letter':x, 'N':y}) 我想把这些柱状

我想从pandas dataframe中的分组数据创建一组直方图。这里有一个类似的问题。要生成与我正在使用的非常相似的玩具数据,可以使用以下代码:

    from pandas import DataFrame
    import numpy as np
    x = ['A']*300 + ['B']*400 + ['C']*300
    y = np.random.randn(1000)
    df = DataFrame({'Letter':x, 'N':y})
我想把这些柱状图(读取装箱数据)放在一个新的数据框中,并将其保存以供以后处理。这才是真正的关键,我的文件是6GB,有400k+组,只有2列

我考虑过使用一个简单的for循环来完成这项工作:

    data=[]
    for group in df['Letter'].unique():
        data.append(np.histogram(df[df['Letter']==group]['N'],range=(-2000,2000),bins=50,density=True)[0])
    df2=DataFrame(data)
请注意,bin、range和density关键字对于我来说都是必需的,以便直方图在我的新dataframe df2中的行之间保持一致并标准化(参数值来自我的真实数据集,因此它在toy数据集上是多余的)。for循环工作得很好,在toy数据集上生成了预期的3行50列的数据帧。在我的真实数据集上,我估计完成代码的时间大约是9天。有没有更好/更快的方法来完成我正在寻找的任务


另外,我考虑过多处理,但我认为创建进程和切片数据的开销将比串行运行慢(我可能错了,不介意在这一点上进行更正)

对于您在这里描述的问题类型,我个人通常会执行以下操作,基本上是将整个任务委托给多线程Cython/C++。这是一项工作,但并非不可能,我不确定目前是否真的有可行的替代方案

以下是构建模块:

  • 首先,您的
    df.x.values
    df.y.values
    只是numpy数组。演示如何从此类数组中获取C指针

  • <> L> >现在你有指针,你可以使用Cython和上面的任何Python写一个真正的多线程程序(现在你在C++领域)。假设有k个线程扫描6GB数组,线程i处理密钥散列为i模k的组

  • 对于C程序(这就是您现在的代码),GNU科学库有一个

  • >P>当<代码> Prange完成时,需要将C++结构转换回NUMPY数组,并从那里返回到数据文件。用Cython包装整个过程,并像使用普通Python函数一样使用它


在我与一位同事讨论得到答案的过程中,当他意识到6GB的数据保存在SQL数据库中,而我已将其传输到python时,他建议我重写查询,以我想要的形式提供数据。但你给出的答案正是我最初想要的,所以我接受了。