簡體   English   中英

平均多個熊貓列的行子集

[英]Average a subset of rows across multiple pandas columns

我有一個地理數據集,正在嘗試對其進行平滑處理。 為此,我要在每一行的某個半徑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循環內的數據集中,但這會占用大量內存並導致崩潰。

我只是覺得這可以做得更好

通過使用列表理解,我看到了微小的改進(〜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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM