比逐行计算更有效的Pandas数据帧计算方法

2024-09-30 20:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在我当前的项目中,我正在对森林资源清查数据进行数据分析,并通过最大似然估计对数据进行统计分布拟合。在

我计算每个所需数据子集的每个数据集的结果,得到估计的分布参数和我需要的其他指标,然后将它们全部存储在pandas数据帧中。在

到目前为止,我在一个大for循环中遍历每个数据子集,然后将结果逐行分配给dataframe。在

我想知道的是,有没有一种更有效的方法?我也不想有太多的数据拷贝,因为我经常有一百万个数据点。在

我已经创建了一个非常简化的例子,其中包含人工数据,没有最大似然估计,但它显示了基本结构

import pandas as pd
import scipy as sp

import numpy.random as sprd

def Gen_UniformDist(seed=5, size=1000000):
    """ Create a set of random numbers uniformly distributed between 0 and 1 """
    sprd.seed(seed)    
    return sprd.uniform(size=size)

# Generate some test data
dataSet = Gen_UniformDist()

# Create an array of truncation vales
truncValue_arr = sp.linspace(0., 0.9, 20)

df_Output = pd.DataFrame(index=truncValue_arr, columns=['mean', 'NumObs'])

for i, truncValue in enumerate(truncValue_arr):
    # Truncate the data using the truncation value
    truncated_DataSet = dataSet[ dataSet >= truncValue]

    # In my real code the function here is more complex max likelihood 
    # rather than simple mean used for simplicity here
    mean = sp.mean(truncated_DataSet)

    numObs = len(truncated_DataSet)

    # Real code would calculate more than 2 values for each row
    df_Output.iloc[i] = [mean, numObs]

我想做的是在不使用for循环的情况下高效地填充数据帧,同时避免周围有大量的数据副本。这可能吗?在


Tags: the数据importforsizeasmeandataset
1条回答
网友
1楼 · 发布于 2024-09-30 20:32:15

您的算法有两个方面可以直接优化:

  1. for循环替换为列表理解。在
  2. 与重复的iloc调用不同,构建一个元组列表并直接提供给pd.DataFrame。在

下面是一些伪代码:

def return_values(data):
    return sp.mean(data), len(data.index)

L = [return_values(dataSet[dataSet >= truncValue]) for truncValue in truncValue_arr]

df = pd.DataFrame(data=L, index=truncValue_arr, columns=['mean', 'NumObs'])

可以通过重构每个循环中发生的dataSet >= truncValue进一步优化。考虑以下因素:

^{pr2}$

因此,您可以执行以下操作:

mask = np.array(dataset)[:, None] >= np.array(truncValue_arr)

L = [return_values(dataset.loc[mask[:, i]]) \
     for i, truncValue in enumerate(truncValue_arr)]

相关问题 更多 >