Сводка
Я пытаюсь перебрать большой фрейм данных.Определите уникальные группы на основе нескольких столбцов, примените среднее значение к другому столбцу на основе количества в группе.Мой нынешний подход очень медленный при итерации большого набора данных и применении функции усреднения по многим столбцам.Есть ли способ, которым я могу сделать это более эффективно?
Пример
Вот пример проблемы.Я хочу найти уникальные комбинации ['A', 'B', 'C'].Для каждой уникальной комбинации я хочу получить значение столбца ['D'] / количество строк в группе.
Редактировать: Результирующий фрейм данных должен сохранять дублированные группы.Но с отредактированным столбцом 'D'
import pandas as pd
import numpy as np
import datetime
def time_mean_rows():
# Generate some random data
A = np.random.randint(0, 5, 1000)
B = np.random.randint(0, 5, 1000)
C = np.random.randint(0, 5, 1000)
D = np.random.randint(0, 10, 1000)
# init dataframe
df = pd.DataFrame(data=[A, B, C, D]).T
df.columns = ['A', 'B', 'C', 'D']
tstart = datetime.datetime.now()
# Get unique combinations of A, B, C
unique_groups = df[['A', 'B', 'C']].drop_duplicates().reset_index()
# Iterate unique groups
normalised_solutions = []
for idx, row in unique_groups.iterrows():
# Subset dataframe to the unique group
sub_df = df[
(df['A'] == row['A']) &
(df['B'] == row['B']) &
(df['C'] == row['C'])
]
# If more than one solution, get mean of column D
num_solutions = len(sub_df)
if num_solutions > 1:
sub_df.loc[:, 'D'] = sub_df.loc[:,'D'].values.sum(axis=0) / num_solutions
normalised_solutions.append(sub_df)
# Concatenate results
res = pd.concat(normalised_solutions)
tend = datetime.datetime.now()
time_elapsed = (tstart - tend).seconds
print(time_elapsed)
Я знаю, что раздел, вызывающий замедление, - это когда num_solutions> 1. Как я могу сделать это более эффективно