【问题标题】:Pandas dataframe: Group by two columns and then average over another columnPandas 数据框:按两列分组,然后对另一列进行平均
【发布时间】:2016-06-05 21:00:49
【问题描述】:

假设我有一个具有以下值的数据框:

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

我想首先根据前两列(col1 和 col2)对我的数据框进行分组,然后对第三列的值(值)进行平均。所以想要的输出应该是这样的:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas group-by average


    【解决方案1】:

    如果你想按多列分组,你应该把它们放在一个列表中:

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

    或者稍微冗长一些,以便在聚合数据框中获取“平均”一词:

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

    【讨论】:

    • 这与我的回答有何不同?
    • 不用担心,但最好不要发布重复的答案,除非有真正的区别
    【解决方案2】:

    您需要将列列表传递给 groupby,您传递的内容被解释为 axis 参数,这就是它引发错误的原因:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 2023-03-08
      • 2021-08-26
      • 2019-04-02
      • 2023-02-21
      • 2020-12-14
      • 2023-01-03
      相关资源
      最近更新 更多