Pandas DataFrame:A 列中 B 列值的平均值 windows
Pandas DataFrame: mean of column B values within column A windows
如果我在 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
是否可以有效地计算列 A
间隔内列 B
值的平均值?
例如,您可能想要计算列 B
中属于列 A
的 bin 范围 [0,1,2,3,4,5,6,7,8,9,10]
中的值的平均值。因此,对于 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),但它似乎计算了指定长度的 window 的平均值,而不是另一列的 bin 宽度。
使用 cut
将 A
列分割成 bin,然后在这些段上应用 groupby
并计算 B
的 mean
值:
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
更新:您可以使用agg
来应用一组不同的聚合函数,例如mean
、std
和size
例如:
df.groupby(pd.cut(df['A'], bins=np.arange(11)))['B'].agg(['mean', 'std', 'size'])
输出:
mean std size
A
(0, 1] 0.465408 NaN 1
(1, 2] 0.522665 0.149038 4
(2, 3] NaN NaN 0
(3, 4] 0.571255 0.441983 3
(4, 5] 0.659662 NaN 1
(5, 6] 0.394901 0.385560 2
(6, 7] 0.117359 0.107011 2
(7, 8] 0.268144 NaN 1
(8, 9] 0.541056 0.434788 3
(9, 10] 0.593431 0.173556 3
你可以这样做:
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]
.
如果我在 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
是否可以有效地计算列 A
间隔内列 B
值的平均值?
例如,您可能想要计算列 B
中属于列 A
的 bin 范围 [0,1,2,3,4,5,6,7,8,9,10]
中的值的平均值。因此,对于 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),但它似乎计算了指定长度的 window 的平均值,而不是另一列的 bin 宽度。
使用 cut
将 A
列分割成 bin,然后在这些段上应用 groupby
并计算 B
的 mean
值:
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
更新:您可以使用agg
来应用一组不同的聚合函数,例如mean
、std
和size
例如:
df.groupby(pd.cut(df['A'], bins=np.arange(11)))['B'].agg(['mean', 'std', 'size'])
输出:
mean std size
A
(0, 1] 0.465408 NaN 1
(1, 2] 0.522665 0.149038 4
(2, 3] NaN NaN 0
(3, 4] 0.571255 0.441983 3
(4, 5] 0.659662 NaN 1
(5, 6] 0.394901 0.385560 2
(6, 7] 0.117359 0.107011 2
(7, 8] 0.268144 NaN 1
(8, 9] 0.541056 0.434788 3
(9, 10] 0.593431 0.173556 3
你可以这样做:
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]
.