我有一个由两列组成的数据框,例如:
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 列中这些值的平均值。
所以结果表看起来像:
计数 x | 平均 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 是否有任何本机方法可以执行此操作。
谢谢!
答案 0 :(得分:1)
您基本上需要在 bin 上进行分组的聚合(或在 Pandas 的“cuts”中)。
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]
})
分档限制可以更深思熟虑,但它确实有效。
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"
,只要在组内都没有 NULL 值,选择 x 或 y 都没有关系。
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()
)
这将导致下表:
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