pandas - 二维直方图和平均值
pandas - two-dimensional histogram and averages
我有一个由两列组成的数据框,例如:
x
y
8492
119748
10581
106092
10409
114885
9812
162303
9676
105570
10162
66298
9042
50838
8646
114050
9531
117002
9151
90112
我想生成 x 列中项目的直方图,bin 大小为 500(例如),但有另一列为我提供该 bin 的 y 列中这些值的平均值。
所以结果 table 看起来像这样:
Count x
Avg y
8000
0
0
8500
1
119748
9000
1
114050
9500
2
70475
10000
3
128292
10500
2
90592
11000
1
106092
在这种情况下,我显示的是平均值,但我希望可以选择收集最小 y、最大 y、中值 y。
我可以在 Python 中编写一个函数来执行此操作,但想知道是否有任何本地方法可以使用 Pandas 执行此操作。
谢谢!
你基本上想要一个通过 bins 分组的聚合(或在 pandas “削减”中)。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"x" : [8492, 10581, 10409, 9812, 9676, 10162, 9042, 8646, 9531, 9151],
"y" : [119748, 106092, 114885, 162303, 105570, 66298, 50838, 114050, 117002, 90112]
})
binning 限制可以更仔细地考虑,但它确实起作用了。
bins_size = 500
bins = np.arange(
(df.x.min()// bins_size) * bins_size,
(((df.x.max()// bins_size) + 1) * bins_size) + 1,
bins_size)
您可以以相同的方式向 agg()
添加任何内容,例如 "min"
、"max"
甚至 lambda 函数(当然没有引号)。关于 "count"
选择 x 或 y 都没有关系,只要组内没有 NULL 值即可。
print(df
.assign(bined = lambda var : pd.cut(var.x, bins))
.groupby(["bined"])
.agg(
mean_y = ("y", "mean"),
median_y = ("y", "median"),
count = ("x", "count"))
.reset_index()
)
这将导致下面的 table:
bined mean_y median_y count
0 (8000, 8500] 119748.000000 119748.0 1
1 (8500, 9000] 114050.000000 114050.0 1
2 (9000, 9500] 70475.000000 70475.0 2
3 (9500, 10000] 128291.666667 117002.0 3
4 (10000, 10500] 90591.500000 90591.5 2
5 (10500, 11000] 106092.000000 106092.0 1
我有一个由两列组成的数据框,例如:
x | y |
---|---|
8492 | 119748 |
10581 | 106092 |
10409 | 114885 |
9812 | 162303 |
9676 | 105570 |
10162 | 66298 |
9042 | 50838 |
8646 | 114050 |
9531 | 117002 |
9151 | 90112 |
我想生成 x 列中项目的直方图,bin 大小为 500(例如),但有另一列为我提供该 bin 的 y 列中这些值的平均值。
所以结果 table 看起来像这样:
Count x | Avg y | |
---|---|---|
8000 | 0 | 0 |
8500 | 1 | 119748 |
9000 | 1 | 114050 |
9500 | 2 | 70475 |
10000 | 3 | 128292 |
10500 | 2 | 90592 |
11000 | 1 | 106092 |
在这种情况下,我显示的是平均值,但我希望可以选择收集最小 y、最大 y、中值 y。
我可以在 Python 中编写一个函数来执行此操作,但想知道是否有任何本地方法可以使用 Pandas 执行此操作。
谢谢!
你基本上想要一个通过 bins 分组的聚合(或在 pandas “削减”中)。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"x" : [8492, 10581, 10409, 9812, 9676, 10162, 9042, 8646, 9531, 9151],
"y" : [119748, 106092, 114885, 162303, 105570, 66298, 50838, 114050, 117002, 90112]
})
binning 限制可以更仔细地考虑,但它确实起作用了。
bins_size = 500
bins = np.arange(
(df.x.min()// bins_size) * bins_size,
(((df.x.max()// bins_size) + 1) * bins_size) + 1,
bins_size)
您可以以相同的方式向 agg()
添加任何内容,例如 "min"
、"max"
甚至 lambda 函数(当然没有引号)。关于 "count"
选择 x 或 y 都没有关系,只要组内没有 NULL 值即可。
print(df
.assign(bined = lambda var : pd.cut(var.x, bins))
.groupby(["bined"])
.agg(
mean_y = ("y", "mean"),
median_y = ("y", "median"),
count = ("x", "count"))
.reset_index()
)
这将导致下面的 table:
bined mean_y median_y count
0 (8000, 8500] 119748.000000 119748.0 1
1 (8500, 9000] 114050.000000 114050.0 1
2 (9000, 9500] 70475.000000 70475.0 2
3 (9500, 10000] 128291.666667 117002.0 3
4 (10000, 10500] 90591.500000 90591.5 2
5 (10500, 11000] 106092.000000 106092.0 1