【问题标题】:Average values of one column based on the values of another一列的平均值基于另一列的值
【发布时间】:2021-03-03 15:17:36
【问题描述】:

我有一个数据框,其中有一列中有许多重复值。我想创建另一个数据框,该数据框只有该值的一个实例与原始数据框另一列的匹配值的平均值配对。 示例:

data = [[1,1],[1,2],[2,2],[3,3],[3,1],[2,3],[1,5],[2,7],[3,9]]

df = pd.DataFrame(data, columns = ['A', 'B'])
   A  B
0  1  1
1  1  2
2  2  2
3  3  3
4  3  1
5  2  3
6  1  5
7  2  7
8  3  9

我想对与同一列 A 值匹配的 B 列值进行平均。然后有一个如下所示的新数据框:

  A  B
0  1  2.7
1  2  4
2  3  4.3

我通过循环来做到这一点:

df2 = pdDataFrame(columns = ['A','B'])
uni = df.A.unique()
for x in uni:
    av = df.loc[(df['A'] == x, 'B')].mean()
    df2 = df2.append(pd.DataFrame([[x, av]], columns = ['A', 'B']))

我知道循环遍历 DataFrame 不是一种好的形式,而且这个过程需要很长时间。它还导致了一个没有索引的 DataFrame(它们都是 0)。什么是更合适和更有效的方法来做到这一点。提前谢谢!

【问题讨论】:

    标签: python dataframe for-loop


    【解决方案1】:

    简单地说:

    df.groupby('A')[['B']].mean().reset_index()
        A      B
    0   1   2.666667
    1   2   4.000000
    2   3   4.333333
    

    如果你想要B 舍入:

    df.groupby('A')[['B']].mean().round(1).reset_index()
        A    B
    0   1   2.7
    1   2   4.0
    2   3   4.3
    

    甚至这样,不使用A作为索引,参数as_index=False

    df.groupby('A', as_index=False)[['B']].mean().round(1)
        A    B
    0   1   2.7
    1   2   4.0
    2   3   4.3
    

    【讨论】:

      【解决方案2】:

      您可以按"A" 列对您的表进行分组,并计算每个此类组的平均值:

      df.groupby("A").mean()
      

      结果:

            B
      A     
      1     2.666667
      2     4.000000
      3     4.333333
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 2018-05-03
        • 2021-10-02
        • 1970-01-01
        相关资源
        最近更新 更多