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