pd.wide_to_long处理大表过慢,求高效宽表转长表替代方案
高效宽表转长表优化方案求助
数据结构说明
我有一个包含55049行、667列的Pandas DataFrame,示例结构如下:
import pandas as pd data = { 'g1': [1], 'g2': [2], 'g3': [3], 'st1_1': [1], 'st1_2': [1], 'st1_3': [1], 'st1_4': [1], 'st1_5': [5], 'st1_6': [5], 'st1_7': [5], 'st1_8': [5], 'st1_Next_1': [8], 'st1_Next_2': [8], 'st1_Next_3': [8], 'st1_Next_4': [8], 'st1_Next_5': [9], 'st1_Next_6': [9], 'st1_Next_7': [9], 'st1_Next_8': [9], 'st2_1': [2], 'st2_2': [2], 'st2_3': [2], 'st2_4': [2], 'st2_5': [2], 'st2_6': [2], 'st2_7': [2], 'st2_8': [2], 'ft_1': [1], 'ft_2': [0], 'ft_3': [1], 'ft_4': [1], 'ft_5': [1], 'ft_6': [0], 'ft_7': [0], 'ft_8': [1] } df = pd.DataFrame(data) print(df)
当前实现及性能瓶颈
为实现宽表转长表并过滤ft列值为1的行(即ft_1对应所有后缀为_1的列,以此类推至_8),我使用pd.wide_to_long编写了如下代码:
ilist = ['g1','g2','g3'] stublist = ['st1','st1_Next','st2','ft'] df_long = pd.wide_to_long( df.reset_index(), i=['index']+ilist , stubnames= stublist, j='j', sep='_').reset_index() df_long = df_long[df_long['ft']==1]
该代码能得到正确结果,但性能极差:单表处理耗时约2分钟,800+源文件总耗时高达1600分钟,常规优化手段无效。
使用pivot_longer的问题
尝试改用pivot_longer优化性能,代码如下:
ilist = ['g1','g2','g3'] stublist = ['st1','st1_Next','st2','ft'] df_pvot = df.pivot_longer(index=ilist,names_to=stublist,names_pattern=stublist) print(df_pvot)
但输出丢失了st1_Next列,对应数据被错误合并到st1列中,输出结果如下:
g1 g2 g3 st1 st2 ft 0 1 2 3 1 2.0 1.0 1 1 2 3 1 2.0 0.0 2 1 2 3 1 2.0 1.0 3 1 2 3 1 2.0 1.0 4 1 2 3 5 2.0 1.0 5 1 2 3 5 2.0 0.0 6 1 2 3 5 2.0 0.0 7 1 2 3 5 2.0 1.0 8 1 2 3 8 NaN NaN 9 1 2 3 8 NaN NaN 10 1 2 3 8 NaN NaN 11 1 2 3 8 NaN NaN 12 1 2 3 9 NaN NaN 13 1 2 3 9 NaN NaN 14 1 2 3 9 NaN NaN 15 1 2 3 9 NaN NaN
需求
寻求高效的宽表转长表替代方案,同时解决pd.wide_to_long效率低下和pivot_longer列丢失的问题。
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

