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}}))