Я пытаюсь использовать pandas.DataFrame.groupby['x']
для расчета по сгруппированному df
, по x
.
Проблема возникает, когда 'x'
повторяется более одного раза.Функция apply будет выполнять вычисления столько раз, сколько повторяется 'x'
, хотя мне нужны только "агрегированные" значения (на самом деле это не агрегация , а скорее как - обработка ).
Вот игрушечный пример:
def simulate_complicated_func(df):
# This function simulates complicate calculations
returned_col_names = ['calc1', 'calc2', 'calc3']
df['calc1'] = ''.join(df['var1'])
df['calc2'] = df['var2'].mean()
df['calc3'] = ''.join(df['var1']) + str(df['var2'].max())
return df[['id'] + returned_col_names]
df = pd.DataFrame({'id':['id1', 'id1', 'id2', 'id3', 'id3', 'id3'],
'var1':['abc', 'cba', 'abc', 'cba', 'abc', 'cba'],
'var2':[9, 4, 7, 4, 1, 3]})
print(df)
id var1 var2
0 id1 abc 9
1 id1 cba 4
2 id2 abc 7
3 id3 cba 4
4 id3 abc 1
5 id3 cba 3
res_df = df.groupby(['id']).apply(simulate_complicated_func).drop_duplicates()
print(res_df)
id calc1 calc2 calc3
0 id1 abccba 6.500000 abccba9
2 id2 abc 7.000000 abc7
3 id3 cbaabccba 2.666667 cbaabccba4
Вывод - именно то, что я хочу, но он не эффективен.Есть ли лучший способ сделать это с помощью панд?
Редактировать: Как оптимизировать?
Если мы добавим оператор print
к simulate_complicated_func()
def simulate_complicated_func(df):
# This function simulates complicate calculations
print("function called")
# ...
Мы видим, что код напечатает его 6 раз:
function called
function called
function called
function called
function called
function called
На самом деле, нам нужно получить доступ к этой функции только 3 раза (количество групп, созданных groupby).