You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Python-Polars中类似Pandas DataFrame.update()的DataFrame更新方案

在Polars中保留透视表的完整行/列并填充空值为0

要实现保留原始数据中所有development行(包括被过滤掉的High)和investment列(包括500MN+),同时将无数据的位置填充为0的需求,可按照以下步骤操作:

完整实现代码

import polars as pl

# 原始数据
data = { 
    'state': ['state 1', 'state 2', 'state 3', 'state 4', 'state 5', 'state 6', 'state 7', 'state 8', 'state 9', 'state 10'],
    'development': ['Low', 'Medium', 'Low', 'Medium', 'High', 'Low', 'Medium', 'Medium', 'Low', 'Medium'],
    'investment': ['50-500MN', '<50MN', '<50MN', '<50MN', '500MN+', '50-500MN', '<50MN', '50-500MN', '<50MN', '<50MN'],
    'population': [22, 19, 25, 24, 19, 21, 33, 36, 22, 36],
    'gdp': [18, 19, 29, 23, 22, 19, 35, 18, 26, 27]
}

df = pl.DataFrame(data)

# 获取全量维度值
all_development = df['development'].unique().sort()
all_investment = df['investment'].unique().sort()

# 生成过滤后的透视表
df_filtered = df.filter(pl.col('development') != 'High')
pivot_table = df_filtered.pivot(
    index='development',
    columns='investment',
    values='gdp',
    agg=pl.mean
)

# 补全缺失的investment列,填充0
for col in all_investment:
    if col not in pivot_table.columns:
        pivot_table = pivot_table.with_columns(pl.lit(0.0).alias(col))

# 补全缺失的development行,填充0
full_pivot = pivot_table.join(
    pl.DataFrame({'development': all_development}),
    on='development',
    how='right'
).fill_null(0)

# 调整列顺序匹配全量维度
full_pivot = full_pivot.select(['development'] + all_investment.to_list())

print(full_pivot)

代码解释

  1. 提取全量维度:从原始数据中获取development和investment的所有唯一值并排序,确保覆盖所有可能的维度,避免遗漏。
  2. 生成过滤后的透视表:基于过滤后的数据生成透视表,这里使用pl.mean做聚合计算,可根据业务需求替换为pl.sum、pl.median等其他聚合函数。
  3. 补全缺失列:遍历所有investment维度值,若透视表中没有对应列,则新增该列并填充0。
  4. 补全缺失行:通过right join关联包含全量development值的表,保留所有行,并用fill_null(0)填充缺失的数值。
  5. 调整列顺序:确保输出的列顺序和原始investment维度的顺序一致,符合业务展示规范。

内容的提问来源于stack exchange,提问作者Suresh Nimbalkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:10:27