对多列中的行子集求平均值

2024-03-29 11:33:42 发布

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

我有一个地理数据的数据集,我正在试图平滑。为此,我为每一行找到半径r内的所有最近邻,然后选择这些行并取一个平均值并将其作为一列添加到原始数据帧中。这样做的准则是

import pandas as pd
import numpy as np
import scipy.spatial as spatial

d = {'id': [1,2,3,4,5], 'x': [1,2,3,3,4], 'y': [1,3,2,3,4], 'factor1':[4,5,2,7,4], 'factor2':[6,4,8,3,2]}
df = pd.DataFrame(data=d)

factor = ["factor1", "factor2"]
dist = [2,1.5]

X=np.transpose(np.array([df.x, df.y]))
tree = spatial.cKDTree(X)
for i in dist:
    for j in factor:
        df[j + "_Mean_" + str(i)] = df.apply(lambda row: df[j][tree.query_ball_point([row.x, row.y],i)].mean(), axis=1)

这目前工作正常,但需要时间,因为它必须循环每个功能来平均它。但是,由于我已经在查找最近邻(需要时间的位),可能有某种方法可以选择所有最近邻行并一次平均所有列,然后将它们添加到数据集中,但我无法确定如何/是否可以做到这一点。我曾尝试为每一行查找最近邻居的所有索引,并将它们存储在I循环内的数据集中,但这会占用大量内存并导致崩溃。你知道吗

我只是觉得这可以做得更好


Tags: 数据inimporttreedffordistas
1条回答
网友
1楼 · 发布于 2024-03-29 11:33:42

我看到了一个小(~20%)的改善,而不是使用列表理解。你知道吗

但请检查它如何与您的完整数据集进行缩放。你知道吗

import pandas as pd
import numpy as np
import scipy.spatial as spatial

d = {'id': [1,2,3,4,5], 'x': [1,2,3,3,4], 'y': [1,3,2,3,4], 'factor1':[4,5,2,7,4], 'factor2':[6,4,8,3,2]}
df = pd.DataFrame(data=d)

factor = ["factor1", "factor2"]
dist = [2,1.5]

X=np.transpose(np.array([df.x, df.y]))
tree = spatial.cKDTree(X)

def original(df):
    for i in dist:
        for j in factor:
            df[j + "_Mean_" + str(i)] = df.apply(lambda row: df[j][tree.query_ball_point([row.x, row.y],i)].mean(), axis=1)
    return df

def jp(df):
    calc = tree.query_ball_point    
    for i in dist:
        for j in factor:
            df_filter = df[j]
            df[j + "_Mean_" + str(i)] = [df_filter[calc([x, y],i)].mean() for x, y in zip(df['x'], df['y'])]
    return df

%timeit original(df)  # 100 loops, best of 3: 13.1 ms per loop
%timeit jp(df)        # 100 loops, best of 3: 10.9 ms per loop

相关问题 更多 >