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

Python中更简洁的DataFrame结构转换实现方案

解决方案

方案1:利用Pandas内置explode方法(推荐)

explode可以直接展开列表型单元格,无需手动实现flatten逻辑,同时避免全局变量的问题,代码更易维护:

import pandas as pd

def process_data(df, zones):
    # 处理原始数据(zone、x、y)
    data_dfs = []
    for zone in zones:
        # 提取当前zone的x和y,转置后添加zone标识
        temp_df = df[[zone]].loc[['x', 'y']].T
        temp_df['zone'] = zone
        # 展开列表列
        temp_df = temp_df.explode(['x', 'y'])
        data_dfs.append(temp_df)
    # 合并所有zone数据并整理列顺序
    data = pd.concat(data_dfs).reset_index(drop=True)[['zone', 'x', 'y']]
    
    # 处理拟合数据(xfit、yfit)
    fit_dfs = []
    for zone in zones:
        temp_fit = df[[zone]].loc[['xfit', 'yfit']].T
        temp_fit = temp_fit.explode(['xfit', 'yfit'])
        fit_dfs.append(temp_fit)
    fit_data = pd.concat(fit_dfs).reset_index(drop=True)
    
    return fit_data, data

# 调用示例
if __name__ == "__main__":
    zones = ['G1','G2','G3','G4','G5']
    fit_data, data = process_data(df, zones)
    print(data)

方案2:用列表推导式直接生成扁平化数据

贴近原逻辑,通过嵌套列表推导式直接生成所有扁平化数据,无需提前定义空列表:

import pandas as pd

def process_data(df, zones):
    # 生成重复的zone标识,长度与对应x列表一致
    zone_list = [zone for zone in zones for _ in df[zone]['x']]
    # 直接生成扁平化的各类数据
    xdata = [item for zone in zones for item in df[zone]['x']]
    ydata = [item for zone in zones for item in df[zone]['y']]
    xfit = [item for zone in zones for item in df[zone]['xfit']]
    yfit = [item for zone in zones for item in df[zone]['yfit']]
    
    data = pd.DataFrame({'zones': zone_list, 'x': xdata, 'y': ydata})
    fit_data = pd.DataFrame({'xfit': xfit, 'yfit': yfit})
    
    return fit_data, data

# 调用示例
if __name__ == "__main__":
    zones = ['G1','G2','G3','G4','G5']
    fit_data, data = process_data(df, zones)
    print(data)

方案3:移除冗余类结构

原代码中的类未使用实例属性,完全可以改成独立函数,减少不必要的结构嵌套,上面两个方案都已采用这种方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:15:34