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
相关产品推荐
相关产品推荐

