Pandas dataframe: Group by two columns and then average over another column

ahajib picture ahajib · Feb 23, 2016 · Viewed 19.6k times · Source

Assuming that I have a dataframe with the following values:

df:
col1    col2    value
1       2       3
1       2       1
2       3       1

I want to first groupby my dataframe based on the first two columns (col1 and col2) and then average over values of the thirs column (value). So the desired output would look like this:

col1    col2    avg-value
1       2       2
2       3       1

I am using the following code:

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

which gets the following error:

ValueError: No axis named col2 for object type <class 'pandas.core.frame.DataFrame'>

Any help would be much appreciated.

Answer

EdChum picture EdChum · Feb 23, 2016

You need to pass a list of the columns to groupby, what you passed was interpreted as the axis param which is why it raised an error:

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