gpt4 book ai didi

python - 比 Pandas Dataframe 逐行计算更有效的方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:44:03 24 4
gpt4 key购买 nike

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

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

到目前为止,我在一个大的 for 循环中遍历每个数据子集来完成所有这些操作,然后将结果逐行分配给数据帧。

我想知道是否有更有效的方法来做到这一点?我也不想拥有大量数据副本,因为我通常拥有一百万个左右的数据点。

我使用人工数据创建了一个非常简化的示例,没有使用最大似然估计,但这显示了基本结构

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 循环的情况下有效地填充数据帧,但也要避免周围有大量数据副本。这可能吗?

最佳答案

您的算法有两个方面可以立即优化:

  1. for 循环替换为列表推导式。
  2. 构建元组列表并直接提供给 pd.DataFrame,而不是重复的 iloc 调用。

这是一些伪代码:

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 来进一步优化。考虑以下因素:

s = pd.Series([1, 2, 3, 4, 5])
vals = np.array([2, 4])

s[:, None] > vals

array([[False, False],
[False, False],
[ True, False],
[ True, False],
[ True, True]], dtype=bool)

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

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

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

关于python - 比 Pandas Dataframe 逐行计算更有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52625864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com