2015-05-27 3 views
13

Для следующего dataframe:Как рассчитать средние значения сгруппированных на другой колонке в панд

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 

Но мне интересно, есть ли что-то более прямое в пандах.

ответ

15

Вы можете 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 tutorial.

5

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

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

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

Здесь мы GroupBy столбец «StationID», мы тогда доступ в столбце «BiasTemp» и называют mean на нем

Существует раздел в docs по этой функциональности.

Смежные вопросы