首页 > 解决方案 > 按名称将列组融合为目标列

问题描述

这个问题建立在Pandas 的基础上,将几组列按名称融合为多个目标列。但是,我的数据以一种令人讨厌的方式组织

import pandas as pd

df = pd.DataFrame([(101, 'a', 'b', 'c', 'd', 'e', 'f', 1, 2, 3, 4, 5, 6, 'aa', 'bb', 'cc', 'dd', 'ee', 'ff'),
                   (102,'g', 'h', 'i', 'j', 'k', 'l' , 7, 8, 9, 10, 11, 12, 'gg', 'hh', 'ii', 'jj', 'kk', 'll')], 
                   columns=['id','a__1', 'a__2', 'a__3', 'a_1', 'a_2', 'a_3','b__1', 'b__2', 'b__3', 'b_1', 'b_2', 'b_3','c__1', 'c__2', 'c__3', 'c_1', 'c_2', 'c_3'])

df

数据框如下所示:

    id a__1 a__2 a__3 a_1 a_2 a_3  b__1  b__2  b__3  b_1  b_2  b_3 c__1 c__2  \
0  101    a    b    c   d   e   f     1     2     3    4    5    6   aa   bb   
1  102    g    h    i   j   k   l     7     8     9   10   11   12   gg   hh   

  c__3 c_1 c_2 c_3  
0   cc  dd  ee  ff  
1   ii  jj  kk  ll 

正如您所看到的,并非所有分隔符都只是一个下划线,它们有时是两个下划线。

最后,我想按以下方式组织我的数据,注意 a__1 应该在 a_1 之前,依此类推:

     id   a   b   c
0   101   a   1   aa
1   101   b   2   bb
2   101   c   3   cc
3   101   d   4   dd
4   101   e   5   ee
5   101   f   6   ff   
6   102   g   7   gg
7   102   h   8   hh
8   102   i   9   ii
9   102   j   10  jj
10  102   k   11  kk
11  102   l   12  ll

基本上我的问题是,有时我不是只有一个下划线,而是 2。现在这不适用于 pd.wide_to_long 函数,因为我无法将分隔符参数设置为“_”或“__”。我希望你能理解我的问题。

标签: pythonpandasdataframetransform

解决方案


你可以使用@Wen old favorite pd.wide_to_long

pd.wide_to_long(df,['a','b','c'],i='id',j='new',sep='_',suffix='.')\
  .reset_index('new', drop=True)\
  .sort_index()

输出:

     a   b   c
id            
101  a   1  aa
101  b   2  bb
101  c   3  cc
101  d   4  dd
101  e   5  ee
101  f   6  ff
102  g   7  gg
102  h   8  hh
102  i   9  ii
102  j  10  jj
102  k  11  kk
102  l  12  ll

推荐阅读