pandas - 二维直方图和平均值

时间:2021-03-26 11:53:51

标签: python pandas histogram

我有一个由两列组成的数据框,例如:

<头>
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 是否有任何本机方法可以执行此操作。

谢谢!

1 个答案:

答案 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
相关问题