python 中的 pd.wide_to_long 很慢

问题描述 投票:0回答:1

我有一个包含 55049 行和 667 列的数据框。

示例数据帧结构如下:


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': [1],
    'st1_6': [1],
    'st1_7': [1],
    'st1_8': [1],
    
    '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)

为了获得我想要的输出,我使用以下代码

pd.wide_to_long

ilist = ['g1','g2','g3']
stublist = ['st1','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]

上面的代码运行良好,达到了预期的结果。

我执行了这个wide_to_long来应用过滤器

df_long[df_long['ft']==1]
。这意味着 ft_1 需要为所有 _1 申请,ft_2 为所有 _2 申请......对于所有 _8 也是如此。

问题是执行wide_to_long操作大约需要2分钟,因为我有800多个源文件来处理整个过程需要1600分钟,这是相当高的。

我正在寻找任何替代建议来转置数据。

我已经尝试过this,但对我来说没有太大区别。

python pandas dataframe transform
1个回答
0
投票

一个选项是使用 pivot_longer,您可以将新的标头名称传递给

names_to
,并将正则表达式列表传递给
names_pattern
:

# pip install pyjanitor
import pandas as pd

df.pivot_longer(index=ilist,names_to=stublist,names_pattern=stublist)
   g1  g2  g3  st1  st2  ft
0   1   2   3    1    2   1
1   1   2   3    1    2   0
2   1   2   3    1    2   1
3   1   2   3    1    2   1
4   1   2   3    1    2   1
5   1   2   3    1    2   0
6   1   2   3    1    2   0
7   1   2   3    1    2   1

另一个选项是重塑列,然后是 pd.stack:

reshaped = df.set_index(ilist)
reshaped.columns = reshaped.columns.str.split('_',expand=True).set_names([None,'drop'])
reshaped.stack(level='drop').droplevel('drop').reset_index()
   g1  g2  g3  st1  st2  ft
0   1   2   3    1    2   1
1   1   2   3    1    2   0
2   1   2   3    1    2   1
3   1   2   3    1    2   1
4   1   2   3    1    2   1
5   1   2   3    1    2   0
6   1   2   3    1    2   0
7   1   2   3    1    2   1
© www.soinside.com 2019 - 2024. All rights reserved.