首页 > 解决方案 > 根据条件计算熊猫数据框每一列的平均值(即averageifs)

问题描述

我不知道为什么我在这个问题上如此努力。我正在尝试在 pandas 数据框中进行与 averageifs calc 等效的 excel。

我有以下内容:

df = pd.DataFrame(rng.rand(1000, 7), columns=['1/31/2019', '2/28/2019', '3/31/2019', '4/30/2019', '5/31/2019', '6/30/2019', '7/31/2019'])

我还有一个专栏:

df['Doc_Number'] = ['A', 'B', 'C', 'B', 'C', 'B', 'A', 'A', 'D', 'G', 'G', 'D', 'G', 'B' ...]

我想在 df 的每一列上的 Doc_Number 上执行与 averageifs 等效的 excel,同时保持数据框的结构。所以在每一列中,我会计算 df['Doc_Number'] = ['A', 'B', 'C'...] 的平均值,但我仍然会保留 1,000 行并且我会应用计算到每个单独的列 ['1/31/2019'、'2/28/2019'、'3/31/2019' ...]。

对于单个列,我会执行以下操作:

df['AverageIfs'] = df.groupby('Doc_Number')['1/31/2019'].transform('np.mean')

但是如何将计算应用于 df 的每一列?实际上,我有更多的列可以应用计算。

我是一个完全的业余爱好者,所以感谢您提出我的问题。

标签: pandasdataframemean

解决方案


您可以['1/31/2019']在 groupby 之后删除以将所有列处理为 new DataFramme,更改列名称add_suffix并添加到原始 by join

#simplify df for easy check output
np.random.seed(123)
df = pd.DataFrame(np.random.rand(14, 2), columns=['1/31/2019', '2/28/2019'])
df['Doc_Number'] = ['A', 'B', 'C', 'B', 'C', 'B', 'A', 'A', 'D', 'G', 'G', 'D', 'G', 'B']

print (df)
    1/31/2019  2/28/2019 Doc_Number
0    0.696469   0.286139          A
1    0.226851   0.551315          B
2    0.719469   0.423106          C
3    0.980764   0.684830          B
4    0.480932   0.392118          C
5    0.343178   0.729050          B
6    0.438572   0.059678          A
7    0.398044   0.737995          A
8    0.182492   0.175452          D
9    0.531551   0.531828          G
10   0.634401   0.849432          G
11   0.724455   0.611024          D
12   0.722443   0.322959          G
13   0.361789   0.228263          B

df = df.join(df.groupby('Doc_Number').transform('mean').add_suffix('_mean'))
print (df)
    1/31/2019  2/28/2019 Doc_Number  1/31/2019_mean  2/28/2019_mean
0    0.696469   0.286139          A        0.511029        0.361271
1    0.226851   0.551315          B        0.478146        0.548364
2    0.719469   0.423106          C        0.600200        0.407612
3    0.980764   0.684830          B        0.478146        0.548364
4    0.480932   0.392118          C        0.600200        0.407612
5    0.343178   0.729050          B        0.478146        0.548364
6    0.438572   0.059678          A        0.511029        0.361271
7    0.398044   0.737995          A        0.511029        0.361271
8    0.182492   0.175452          D        0.453474        0.393238
9    0.531551   0.531828          G        0.629465        0.568073
10   0.634401   0.849432          G        0.629465        0.568073
11   0.724455   0.611024          D        0.453474        0.393238
12   0.722443   0.322959          G        0.629465        0.568073
13   0.361789   0.228263          B        0.478146        0.548364

推荐阅读