Расплавить группу столбцов в целевые столбцы по имени - PullRequest
0 голосов
/ 30 апреля 2018

Этот вопрос основан на Панды объединяют несколько групп столбцов в несколько целевых столбцов по имени . Тем не менее, мои данные организованы досадно

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, поскольку я не могу установить аргумент разделителя как '_' или '__'. Я надеюсь, вы понимаете мой вопрос.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать @Wen old favourite 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
0 голосов
/ 30 апреля 2018

Вы можете использовать repalce reaplce all '_' и '__' to '', затем мы используем stack, чтобы изменить вашу df, после использования cumcount создайте уникальный ключ, который мы можем достичь того, что вам нужно

df.columns=df.columns.str.replace('_','')
s=df.set_index('id').stack().reset_index(level=1)
s.level_1=s.level_1.str[0]
s['New']=s.groupby('level_1').cumcount()



s.set_index(['New','level_1'],append=True)[0].unstack()


Out[509]: 
level_1  a   b   c
id  New           
101 0    a   1  aa
    1    b   2  bb
    2    c   3  cc
    3    d   4  dd
    4    e   5  ee
    5    f   6  ff
102 6    g   7  gg
    7    h   8  hh
    8    i   9  ii
    9    j  10  jj
    10   k  11  kk
    11   l  12  ll
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...