df是一个Polar演示DataFrame:

df = pl.DataFrame(
    {
        "groups": ["A", "A", "A", "B", "B", "B"],
        "values": [1, 2, 3, 4, 5, 6],
        }
)

当前的group_by.agg() apracach对于创建描述性统计有点不方便:

print(
    df.group_by("groups").agg(
    pl.len().alias("count"),
    pl.col("values").mean().alias("mean"),
    pl.col("values").std().alias("std"),
    pl.col("values").min().alias("min"),
    pl.col("values").quantile(0.25).alias("25%"),
    pl.col("values").quantile(0.5).alias("50%"),
    pl.col("values").quantile(0.75).alias("75%"),
    pl.col("values").max().alias("max"),
    pl.col("values").skew().alias("skew"),
    pl.col("values").kurtosis().alias("kurtosis"),
)
)

out:
shape: (2, 11)
┌────────┬───────┬──────┬─────┬───┬─────┬─────┬──────┬──────────┐
│ groups ┆ count ┆ mean ┆ std ┆ … ┆ 75% ┆ max ┆ skew ┆ kurtosis │
│ ---    ┆ ---   ┆ ---  ┆ --- ┆   ┆ --- ┆ --- ┆ ---  ┆ ---      │
│ str    ┆ u32   ┆ f64  ┆ f64 ┆   ┆ f64 ┆ i64 ┆ f64  ┆ f64      │
╞════════╪═══════╪══════╪═════╪═══╪═════╪═════╪══════╪══════════╡
│ B      ┆ 3     ┆ 5.0  ┆ 1.0 ┆ … ┆ 6.0 ┆ 6   ┆ 0.0  ┆ -1.5     │
│ A      ┆ 3     ┆ 2.0  ┆ 1.0 ┆ … ┆ 3.0 ┆ 3   ┆ 0.0  ┆ -1.5     │
└────────┴───────┴──────┴─────┴───┴─────┴─────┴──────┴──────────┘

我想编写一个自定义的group_by扩展模块,允许我通过调用来实现相同的结果:

df.describe(by="groups", percentiles=[xxx], skew=True, kurt=True)

df.group_by("groups").describe(percentiles=....)

推荐答案

调用这个将输出与您在问题中提到的相同



class DescribeAccessor:
    def __init__(self, df: pl.DataFrame):
        self._df = df

    def __call__(
            self,
            by: str,
            percentiles: list = [0.25, 0.5, 0.75],
            skew: bool = True,
            kurt: bool = True,
    ) -> pl.DataFrame:
        percentile_exprs = [
            pl.col("values").quantile(p).alias(f"{int(p * 100)}%")
            for p in percentiles
        ]

        aggs = [
            pl.len().alias("count"),
            pl.col("values").mean().alias("mean"),
            pl.col("values").std().alias("std"),
            pl.col("values").min().alias("min"),
            *percentile_exprs,
            pl.col("values").max().alias("max"),
        ]

        if skew:
            aggs.append(pl.col("values").skew().alias("skew"))

        if kurt:
            aggs.append(pl.col("values").kurtosis().alias("kurtosis"))

        return self._df.groupby(by).agg(aggs)


pl.DataFrame.describe = property(lambda self: DescribeAccessor(self))

df = pl.DataFrame(
    {
        "groups": ["A", "A", "A", "B", "B", "B"],
        "values": [1, 2, 3, 4, 5, 6],
    }
)

print(df.describe(by="groups", percentiles=[0.25, 0.5, 0.75], skew=True, kurt=True))

Python相关问答推荐

在内部列表上滚动窗口

将数据框架与导入的Excel文件一起使用

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

如何让Flask 中的请求标签发挥作用

如何将多进程池声明为变量并将其导入到另一个Python文件

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

如何在达到end_time时自动将状态字段从1更改为0

在极中解析带有数字和SI前缀的字符串

Gekko中基于时间的间隔约束

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

处理Gekko的非最优解

从一个df列提取单词,分配给另一个列

计算机找不到已安装的库'

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

pytest、xdist和共享生成的文件依赖项

上传文件并使用Panda打开时的Flask 问题

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

使用美汤对维基百科表格进行网络刮擦未返回任何内容

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?

运行从Airflow包导入的python文件,需要airflow实例?