Как вычислить средние значения, сгруппированные в другом столбце в Pandas

#python #pandas

#python #pandas #фрейм данных

Вопрос:

Для следующего фрейма данных:

 StationID  HoursAhead    BiasTemp  
SS0279           0          10
SS0279           1          20
KEOPS            0          0
KEOPS            1          5
BB               0          5
BB               1          5
 

Я хотел бы получить что-то вроде:

 StationID  BiasTemp  
SS0279     15
KEOPS      2.5
BB         5
 

Я знаю, что могу написать что-то подобное, чтобы получить желаемый результат:

 def transform_DF(old_df,col):
    list_stations = list(set(old_df['StationID'].values.tolist()))
    header = list(old_df.columns.values)
    header.remove(col)
    header_new = header
    new_df = pandas.DataFrame(columns = header_new)
    for i,station in enumerate(list_stations):
        general_results = old_df[(old_df['StationID'] == station)].describe()
        new_row = []
        for column in header_new:
            if column in ['StationID']: 
                new_row.append(station)
                continue
            new_row.append(general_results[column]['mean'])
        new_df.loc[i] = new_row
    return new_df
 

Но мне интересно, есть ли что-то более простое в pandas.

Ответ №1:

Вы могли groupby бы включить StationID , а затем mean() продолжить BiasTemp . Для вывода Dataframe используйте as_index=False

 In [4]: df.groupby('StationID', as_index=False)['BiasTemp'].mean()
Out[4]:
  StationID  BiasTemp
0        BB       5.0
1     KEOPS       2.5
2    SS0279      15.0
 

Без as_index=False Series этого вместо этого возвращается

 In [5]: df.groupby('StationID')['BiasTemp'].mean()
Out[5]:
StationID
BB            5.0
KEOPS         2.5
SS0279       15.0
Name: BiasTemp, dtype: float64
 

Подробнее об groupby этом читайте в этом руководстве по pydata.

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

1. насколько это будет отличаться от выполнения чего-то вроде .transform(numpy.mean) или .apply(numpy.mean) ?

Ответ №2:

Это то, что groupby для:

 In [117]:
df.groupby('StationID')['BiasTemp'].mean()

Out[117]:
StationID
BB         5.0
KEOPS      2.5
SS0279    15.0
Name: BiasTemp, dtype: float64
 

Здесь мы группируем по столбцу ‘StationID’, затем получаем доступ к столбцу ‘BiasTemp’ и вызываем mean его

В документах есть раздел об этой функциональности.

Ответ №3:

можно сделать следующим образом:

 df.groupby('StationID').mean()