Pandas dataframe: группа по двум столбцам, а затем среднее значение по другому столбцу
предполагая, что у меня есть фрейм данных со следующими значениями:
df:
col1 col2 value
1 2 3
1 2 1
2 3 1
Я хочу сначала сгруппировать мой фрейм данных на основе первых двух столбцов (col1 и col2), а затем усреднить значения столбца thirs (value). Таким образом, желаемый результат будет выглядеть следующим образом:
col1 col2 avg-value
1 2 2
2 3 1
Я использую следующий код:
columns = ['col1','col2','avg']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
print(df[['col1','col2','avg']].groupby('col1','col2').mean())
который получает следующую ошибку:
ValueError: No axis named col2 for object type <class 'pandas.core.frame.DataFrame'>
любая помощь была бы очень признательна.
2 ответов
вам нужно передать список столбцов groupby, то, что вы передали, было интерпретировано как axis
param, поэтому он вызвал ошибку:
In [30]:
columns = ['col1','col2','avg']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
print(df[['col1','col2','avg']].groupby(['col1','col2']).mean())
avg
col1 col2
1 2 3
3 3
Если вы хотите сгруппировать по нескольким столбцам, вы должны поместить их в список:
columns = ['col1','col2','value']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
df.loc[2] = [2,3,1]
print(df.groupby(['col1','col2']).mean())
или немного более подробно, чтобы получить слово "avg" в вашем агрегированном фрейме данных:
import numpy as np
columns = ['col1','col2','value']
df = pd.DataFrame(columns=columns)
df.loc[0] = [1,2,3]
df.loc[1] = [1,3,3]
df.loc[2] = [2,3,1]
print(df.groupby(['col1','col2']).agg({'value': {'avg': np.mean}}))