我有一个很大的(~ 300 M行x 44行)框架,我需要根据每个组的特征以某些方式填充空值.

例如,假设我们有

lf = pl.LazyFrame(
    {'group':(1,1,1,2,2,2,3,3,3),
     'val':('yes', None, 'no', '2', '2', '2', 'answer', None, 'answer')
     }
)
┌───────┬────────┐
│ group ┆ val    │
│ ---   ┆ ---    │
│ i64   ┆ str    │
╞═══════╪════════╡
│ 1     ┆ yes    │
│ 1     ┆ null   │
│ 1     ┆ no     │
│ 2     ┆ 2      │
│ 2     ┆ 2      │
│ 2     ┆ 2      │
│ 3     ┆ answer │
│ 3     ┆ null   │
│ 3     ┆ answer │
└───────┴────────┘

当且仅当组在其他单元格中包含单个非空唯一值时,我想填充空值,因为在我的上下文中,这是数据的期望值,并且组中存在多个唯一值(或所有空值)表示另一个将以不同方式处理的问题.

我可以使用以下内容 for each 组填充空值:

filled_lf = (
    lf
    .with_columns(
        pl.col('val')
        .fill_null(pl.col('val').unique().first().over('group')).alias('filled_val')
        )
    )

但是,首先,pl.ol(‘val’).only()似乎包含‘NULL’作为值之一,并且排序是随机的,因此 Select 列表中的第一个值会产生不一致的结果.其次,它不包括我需要的条件.

预期结果:

┌───────┬────────┬────────────┐
│ group ┆ val    ┆ filled_val │
│ ---   ┆ ---    ┆ ---        │
│ i64   ┆ str    ┆ str        │
╞═══════╪════════╪════════════╡
│ 1     ┆ yes    ┆ yes        │
│ 1     ┆ null   ┆ null       │
│ 1     ┆ no     ┆ no         │
│ 2     ┆ 2      ┆ 2          │
│ 2     ┆ 2      ┆ 2          │
│ 2     ┆ 2      ┆ 2          │
│ 3     ┆ answer ┆ answer     │
│ 3     ┆ null   ┆ answer     │
│ 3     ┆ answer ┆ answer     │
└───────┴────────┴────────────┘

Pandas 3.12 极点0.20.1

提前感谢您的建议!

推荐答案

您可以使用drop_nulls()n_unique()来计算列中唯一值的数量.在此之后,您甚至不需要使用fill_null(),因为您知道您希望整个列具有相同的值:

lf.with_columns(
    pl.when(
        pl.col('val').drop_nulls().n_unique() == 1
    ).then(
        pl.col('val').drop_nulls().first()
    ).otherwise(
        pl.col('val')
    ).over('group')
)

┌───────┬────────┐
│ group ┆ val    │
│ ---   ┆ ---    │
│ i64   ┆ str    │
╞═══════╪════════╡
│ 1     ┆ yes    │
│ 1     ┆ null   │
│ 1     ┆ no     │
│ 2     ┆ 2      │
│ 2     ┆ 2      │
│ 2     ┆ 2      │
│ 3     ┆ answer │
│ 3     ┆ answer │
│ 3     ┆ answer │
└───────┴────────┘

或者,对于您的情况,您甚至不需要计算唯一值的数量.您只关心组中是否有一个唯一的值,因此可以在组中使用min()max():

lf.with_columns(
    pl.when(
        pl.col('val').min() == pl.col('val').max()
    ).then(
        pl.col('val').max()
        # alternatively you can use
        # pl.col('val').fill_null('max')
    ).otherwise(
        pl.col('val')
    ).over('group')
)

┌───────┬────────┐
│ group ┆ val    │
│ ---   ┆ ---    │
│ i64   ┆ str    │
╞═══════╪════════╡
│ 1     ┆ yes    │
│ 1     ┆ null   │
│ 1     ┆ no     │
│ 2     ┆ 2      │
│ 2     ┆ 2      │
│ 2     ┆ 2      │
│ 3     ┆ answer │
│ 3     ┆ answer │
│ 3     ┆ answer │
└───────┴────────┘

Python相关问答推荐

删除字符串中第一次出现单词后的所有内容

梯度下降:简化要素集的运行时间比原始要素集长

迭代嵌套字典的值

转换为浮点,pandas字符串列,混合千和十进制分隔符

Tkinter菜单自发添加额外项目

如何在Python中使用另一个数据框更改列值(列表)

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

如何杀死一个进程,我的Python可执行文件以sudo启动?

如何在Python请求中组合多个适配器?

为什么t sns.barplot图例不显示所有值?'

Django Table—如果项目是唯一的,则单行

如何在GEKKO中使用复共轭物

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

504未连接IB API TWS错误—即使API连接显示已接受''

为什么Visual Studio Code说我的代码在使用Pandas concat函数后无法访问?

对数据帧进行分组,并按组间等概率抽样n行

在Python中使用unittest中的补丁进行动态模拟

Chrome 122-如何允许不安全的内容?(不安全下载被阻止)

PySpark:使用重置对窗口进行计数

在给定区间列表的情况下计算不重叠对的数量的最佳方法