Pandas DataFrame:A列窗口中B列值的平均值

时间:2019-04-03 10:48:52

标签: python pandas dataframe mean binning

如果我在Python中有一个pandas DataFrame,如下所示:

import numpy as np
import pandas as pd

a = np.random.uniform(0,10,20)
b = np.random.uniform(0,1,20)
data = np.vstack([a,b]).T

df = pd.DataFrame(data)
df.columns = ['A','B']
df.sort_values(by=['A'])

           A         B
5   0.057519  0.465408
14  1.610972  0.398077
3   1.725556  0.397708
17  1.734124  0.600723
11  1.944105  0.694152
19  3.265799  0.878538
13  3.352460  0.770505
10  3.865299  0.064723
16  4.137863  0.659662
12  5.597172  0.122269
7   5.990105  0.667533
6   6.410582  0.193027
9   6.881429  0.041691
15  7.522877  0.268144
1   8.093155  0.130559
0   8.699004  0.996624
8   8.755095  0.495984
4   9.135271  0.792966
18  9.440045  0.477514
2   9.654226  0.509812

是否可以按列B的间隔有效地计算列A的平均值?

例如,一个人可能想计算B列中属于[0,1,2,3,4,5,6,7,8,9,10]列的bin范围A中的值的平均值。因此,对于bin范围A = {0-1},落入该bin的B值的平均值为0.465408,对于bin范围A = {1-2},落入该bin的B值平均值是0.522665

我找到了pandas.core.window.Rolling.mean(请参阅https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.window.Rolling.mean.html),但是它似乎是在指定长度的窗口上而不是在另一列的bin宽度上计算平均值。

2 个答案:

答案 0 :(得分:1)

使用cutA列细分为bin,然后在这些段上应用groupby并计算mean的{​​{1}}值:

B

输出:

df.groupby(pd.cut(df['A'], bins=np.arange(11)))['B'].mean()

更新:您可以使用A (0, 1] 0.465408 (1, 2] 0.522665 (2, 3] NaN (3, 4] 0.571255 (4, 5] 0.659662 (5, 6] 0.394901 (6, 7] 0.117359 (7, 8] 0.268144 (8, 9] 0.541056 (9, 10] 0.593431 来应用一组不同的聚合函数,例如aggmeanstd

size

输出:

df.groupby(pd.cut(df['A'], bins=np.arange(11)))['B'].agg(['mean', 'std', 'size'])

答案 1 :(得分:1)

您可以执行以下操作:

import numpy as np
import pandas as pd

a = np.random.uniform(0,10,20)
b = np.random.uniform(0,1,20)
data = np.vstack([a,b]).T

df = pd.DataFrame(data=data, columns=['A', 'B'])

bins = pd.cut(df['A'], bins=10)
df.groupby(bins)['B'].agg({'B': 'mean'}).reset_index()

您还可以提供pd.cut的垃圾箱列表,例如bins=[0,1,2,3,4,5,6,7,8,9,10]