寻求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)
代码解释
- 提取全量维度:从原始数据中获取
development和investment的所有唯一值并排序,确保覆盖所有可能的维度,避免遗漏。 - 生成过滤后的透视表:基于过滤后的数据生成透视表,这里使用
pl.mean做聚合计算,可根据业务需求替换为pl.sum、pl.median等其他聚合函数。 - 补全缺失列:遍历所有
investment维度值,若透视表中没有对应列,则新增该列并填充0。 - 补全缺失行:通过
right join关联包含全量development值的表,保留所有行,并用fill_null(0)填充缺失的数值。 - 调整列顺序:确保输出的列顺序和原始
investment维度的顺序一致,符合业务展示规范。
内容的提问来源于stack exchange,提问作者Suresh Nimbalkar
相关产品推荐
相关产品推荐

