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

Pandas用for循环和字典转换DataFrame时数据被覆盖如何解决

可行解决方案

原代码问题:初始化的DataFrame只有3行索引,每个索引位置只能存储一个值,循环赋值时后面Asset的数值会覆盖前一个Asset的对应值,同时预期输出是9行(3个Asset × 3个密度分级),和初始化的3行结构不匹配,所以一直只能得到最后一条的结果。

以下是可直接运行的实现代码:

import pandas as pd
fractions = {"A": 1.35, "B": 1.40, "C": 1.45}
quality = {"POLY_NAME":"POLY", "AS":"Ash", "CV":"CV","FC":"FC","MS":"Moist","TS":"Tots","VM":"Vols","YL":"Yield"}

wash_dic = {'POLY_NAME': {0: 'Asset 1', 1: 'Asset 2', 2: 'Asset 3'},
 'RD': {0: 1.63, 1: 1.63, 2: 1.57},
 'SEAMTH': {0: 3.02, 1: 3.02, 2: 3.37},
 'AAS': {0: 7.76, 1: 7.34, 2: 7.24},
 'ACV': {0: 28.98, 1: 29.18, 2: 29.27},
 'AFC': {0: 54.95, 1: 53.55, 2: 52.38},
 'AMS': {0: 4.22, 1: 4.26, 2: 4.63},
 'ATS': {0: 0.97, 1: 1.09, 2: 1.23},
 'AVM': {0: 33.07, 1: 34.85, 2: 35.75},
 'AYL': {0: 0.4, 1: 0.95, 2: 0.75},
 'BAS': {0: 9.28, 1: 9.27, 2: 9.58},
 'BCV': {0: 28.17, 1: 28.33, 2: 28.09},
 'BFC': {0: 56.21, 1: 54.39, 2: 52.11},
 'BMS': {0: 4.25, 1: 4.25, 2: 4.61},
 'BTS': {0: 0.84, 1: 1.01, 2: 1.22},
 'BVM': {0: 30.25, 1: 32.08, 2: 33.7},
 'BYL': {0: 3.11, 1: 5.44, 2: 4.36},
 'CAS': {0: 11.01, 1: 10.96, 2: 11.25},
 'CCV': {0: 27.31, 1: 27.53, 2: 27.39},
 'CFC': {0: 58.09, 1: 56.0, 2: 53.43},
 'CMS': {0: 4.41, 1: 4.38, 2: 4.62},
 'CTS': {0: 0.63, 1: 0.83, 2: 0.98},
 'CVM': {0: 26.5, 1: 28.66, 2: 30.71},
 'CYL': {0: 13.45, 1: 16.11, 2: 12.94}}
wash = pd.DataFrame(wash_dic)

# 筛选需要转换的指标列
value_cols = [col for col in wash.columns if col[0] in fractions and col[-2:] in quality]
# 宽表转长表
df_long = wash.melt(id_vars='POLY_NAME', value_vars=value_cols, var_name='var', value_name='val')

# 拆分变量做字段映射
df_long['frac_key'] = df_long['var'].str[0]
df_long['quality_key'] = df_long['var'].str[-2:]
df_long['密度分级'] = df_long['frac_key'].map(fractions)
df_long['指标名称'] = df_long['quality_key'].map(quality)

# 长表转回目标宽表结构
df_out = df_long.pivot(index=['POLY_NAME', '密度分级'], columns='指标名称', values='val').reset_index()
df_out = df_out.rename(columns={'POLY_NAME': 'POLY'}).sort_values(by=['POLY', '密度分级']).reset_index(drop=True)
df_out = df_out.rename_axis(None, axis=1).rename(columns={'密度分级': 'Unnamed: 0'})

# 输出字典结构和需求完全匹配,注意需求里的Yiels为笔误,代码输出为正确的Yield,可按需重命名
print(df_out.to_dict())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:36:02