Эффективный подход к Циклическому Просмотру Панд С некоторыми функциями

#python #pandas #for-loop

Вопрос:

У меня есть функция, которая подмножествует некоторые данные, а затем выполняет некоторые вычисления с данными на основе некоторых условий. Моя проблема в том, что набор данных огромен, а цикл for не является идеальным решением, поэтому я надеялся на идею сценария, который мог бы эффективно выполнять то, что я хочу.

Я включаю код и некоторые примеры данных.

 import pandas as pd
import numpy as np


data1 = {
'loc': [3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
'418': [9, 2, 3, 2, 4, 0, 2, 7, 2, 8],
'426': [2, 4, 1, 0, 2, 1, 3, 0, 7, 8],
'428': [1, 10, 5, 8, 2, 7, 10, 0, 3, 5],
'424': [9, 2, 6, 8, 9, 1, 7, 3, 8, 6],
'425': [4, 2, 8, 7, 9, 6, 10, 5, 9, 9],
'423': [2, 7, 3, 10, 8, 1, 2, 9, 3, 9],
'427': [4, 10, 4, 0, 8, 3, 1, 5, 7, 7],
'636': [10, 5, 6, 4, 0, 5, 1, 1, 4, 8],
'sequence': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}

data2 = {
'loc': [4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
'436': [9, 2, 3, 2, 4, 0, 2, 7, 2, 8],
'445': [2, 4, 1, 0, 2, 1, 3, 0, 7, 8],
'446': [1, 10, 5, 8, 2, 7, 10, 0, 3, 5],
'443': [9, 2, 6, 8, 9, 1, 7, 3, 8, 6],
'640': [4, 2, 8, 7, 9, 6, 10, 5, 9, 9],
'444': [2, 7, 3, 10, 8, 1, 2, 9, 3, 9],
'447': [4, 10, 4, 0, 8, 3, 1, 5, 7, 7],
'sequence': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

dfs = [df1, df2]


class GG(object):

    def __init__(self, data=''):
    
        self.data = data
        
    def Xy(self, data):

        vars = data.columns.values.tolist()
        
        # subset the list of column names
        ylist = [v for v in ['loc', '418'] if v in vars]
        xlist = [v for v in ['loc', '426', '428', '424', '425', '423', '427', '636'] if v in vars]
        

        if '418' in vars:
            y = data.loc[:, ylist]
            X = data.loc[:, xlist]
            
            ry = y.groupby(['loc']).transform('mean')
            ry2 = pd.DataFrame(ry)
            
            rX = X.groupby(['loc']).transform('mean').sub(X.mean(numeric_only=True))
            rX2 = pd.DataFrame(rX)
            rX2.drop('loc', axis=1, inplace=True)
            
            return rX2, ry
            
             
        Ylist = [v for v in ['loc', '436'] if v in vars]
        Xlist = [v for v in ['loc', '445', '446', '443', '640', '444', '447'] if v in vars]
        
        if '436' in vars:
            y = data.loc[:, Ylist]
            X = data.loc[:, Xlist]
            
            py = y.groupby(['loc']).transform('mean')
            py2 = pd.DataFrame(py)
            
            pX = X.groupby(['loc']).transform('mean').sub(X.mean(numeric_only=True))
            pX2 = pd.DataFrame(pX)
            pX2.drop('loc', axis=1, inplace=True)
            
            return pX2, py2
 

Чтобы перебирать наборы данных, у меня есть код ниже:

 # return the dataframes
for df in dfs:
    for seq in df['sequence']:
        if seq!=3 and '418' in df:
        
            gg = GG()
            Xr, yr = gg.Xy(df1)
            
        elif seq!=3 and '436' in df:
        
            Xp, yp = gg.Xy(df2)

print('nxr hierarchy: n', Xr)
print('nyr hierarchy: n', yr)

print('nxp hierarchy: n', Xp)
print('nyp hierarchy: n', yp)
 

Мне нужна помощь в том, чтобы найти более эффективный способ перебора данных, учитывая, что данные, которые я использую, огромны.

Комментарии:

1. Вы читали pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html ?