пара расплава в pandas данных - PullRequest
1 голос
/ 27 февраля 2020

Я хочу создать пару новых данных. Я пытался использовать MELT, но это не сработало. Если вы заметили, что столбцы являются парными (то есть код: тип, код1: тип1), я попытался создать список столбцов кода и список столбцов типа, а затем расплавить.

Как бы вы предложили эту проблему? Буду признателен, если будет дано какое-то объяснение.

ОРИГИНАЛЬНЫЕ ДАННЫЕ КАДРА:

id   Name  code code1 code2  type type1 type2
 0    ABC    1      4     8   S     E      T
 1    XYZ    2            5   R            U

ОЖИДАЕМЫЕ ДАННЫЕ КАДРЫ

id name  Code_All Type_All
0   ABC      1      S
0   ABC      4      E
0   ABC      8      T
1   XYZ      2      R
1   XYZ               
1   XYZ      5      U

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

После нескольких разочаровывающих часов я смог завершить это, используя грязный трюк.

Я разделил набор данных на две части.

id, name, code1, code2, code3

id, name, type1, type2, type3

Я транспонировал два кадра данных

Пример первый кадр данных.

id, name, code1

id, name, code2

id, name, code3

Использование pd.concat ([df1.df2], axix = 1) I удалось объединить его и удалить значения NULL и повторяющиеся имена столбцов

FINAL DATAFRAME

id, name, code1, type1

id, name, code2, type2

id, name, code3, type3

0 голосов
/ 28 февраля 2020

Здесь проблема в том, что у нас нет четкого суффикса (первая запись для каждой группы без суффикса) для pd.wide_to_long, поэтому сначала изменили столбцы, а затем применили pd.wide_to_long:

m  = df.set_index(['id','Name'])
cols = m.columns.str.replace('\d+','').to_series()
m.columns=cols.add(cols.groupby(cols).cumcount().astype(str))

out = (pd.wide_to_long(m.reset_index(),['code','type'],['id','Name'],'idx')
                                              .reset_index(['id','Name']))

     id Name  code type
idx                    
0     0  ABC   1.0    S
1     0  ABC   4.0    E
2     0  ABC   8.0    T
0     1  XYZ   2.0    R
1     1  XYZ   NaN  NaN
2     1  XYZ   5.0    U

Код для воспроизведения кадра данных:

d = {'id': {0: 0, 1: 1},
  'Name': {0: 'ABC', 1: 'XYZ'},
  'code': {0: 1, 1: 2},
  'code1': {0: 4.0, 1: np.nan},
  'code2': {0: 8, 1: 5},
  'type': {0: 'S', 1: 'R'},
  'type1': {0: 'E', 1: np.nan},
  'type2': {0: 'T', 1: 'U'}}
df = pd.DataFrame(d)
...