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

