#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()