Оптимизация группового поиска, исключая последнюю строку - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь применить groupby -> mean к n-1 строкам, а затем назначить среднее значение для n-й строки в пандах. Вот следующий код и желаемый результат. Запуск занимает много времени, и мне интересно, кто-нибудь знает, как это оптимизировать.

import pandas as pd
import numpy as np

df = pd.DataFrame({'id': ['A', 'A', 'A', 'B', 'B', 'C'],
                   'vals': [2, 3, 4, 5, 6, 7]})
# current solution
for h in df['id'].unique():
    h_df = df[df['id'] == h]

    indices = h_df.index

    size = h_df.shape[0]

    last_index = indices[size-1]

    if size == 1:
        df.iloc[last_index, df.columns.get_loc('vals')] = np.nan
        continue

    exclude_last = h_df[:size-1]

    avg = (exclude_last.groupby('id')['vals'].mean()).values[0]

    df.iloc[last_index, df.columns.get_loc('vals')] = avg

# output
# id  vals
# A    2
# A    3
# A    2.5 => (2+3) / 2
# B    5
# B    5 => (5/1)
# C    np.nan

1 Ответ

0 голосов
/ 12 апреля 2019

Нет причин перебирать уникальные значения, выбирать группы и делать другую групповую работу.Все, что может сделать само .groupby:

In [1]: def mean_head(group): 
   ...:     group.vals.iloc[-1] = group.vals.iloc[:-1].mean() 
   ...:     return group 
   ...:                                                                                                                                                                                                                                               

In [2]: df.groupby("id").apply(mean_head)                                                                                                                                                                                                                    
Out[2]: 
  id  vals
0  A   2.0
1  A   3.0
2  A   2.5
3  B   5.0
4  B   5.0
5  C   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...