web-dev-qa-db-ja.com

Pandasデータフレーム:2つの列でグループ化し、別の列の平均をとります

次の値のデータフレームがあると仮定します。

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

最初に最初の2つの列(col1とcol2)に基づいてデータフレームをグループ化し、次にthirs列(値)の値を平均化します。したがって、必要な出力は次のようになります。

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'>

どんな助けでも大歓迎です。

11
ahajib

列のリストを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
10
EdChum

複数の列でグループ化する場合は、それらをリストに配置する必要があります。

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

または、集計データフレームでWordの「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}}))
6
jkokorian