#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 ?