Как изменить структуру данных, от широкой к длинной, для нескольких переменных за один или несколько вызовов? - PullRequest
0 голосов
/ 03 декабря 2018

Мне не удалось преобразовать приведенный ниже кадр данных в длинный формат:

  df = pd.DataFrame({'id': [66602088802, 85002620928],
     't1': ['car', 'house'],
     't1_pct': [0.46, 0.51],
     't1_valid': [True, True],
     't2': ['bike', 'car'],
     't2_pct': [0.15, 0.07],
     't2_valid': [True, True],
     't3': ['car', 'toy'],
     't3_pct': [0.06, 0.07],
     't3_valid': [False, False]})

    id               t1     t1_pct  t1_valid t2  t2_pct t2_valid    t3  t3_pct  t3_valid
0   66602088802     car     0.46    True    bike    0.15    True    car     0.06    False
1   85002620928     house   0.51    True    car     0.07    True    toy     0.07    False

Мой желаемый результат ниже.Я пытался использовать pandas.wide_to_long(), но пока не повезло.Заранее спасибо.

    id         test  value     pct     valid
66602088802    1      car     0.46     True
85002620928    1      house   0.51     True
66602088802    2      bike    0.15     True
85002620928    2      car     0.07     True
66602088802    3      car     0.06     False
85002620928    3      toy     0.07     False

Заранее спасибо.

Панды 0.23.4

python 3.7.1

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы можете использовать wide_to_long;проблема только в том, что имена ваших столбцов нужно немного изменить, так что заглушками будут ['pct', 'valid', 'value'], а не t#.

import pandas as pd
import numpy as np

# Reverse order of words around '_'
df.columns = ['_'.join(x.split('_')[::-1]) for x in df.columns]
# Add prefix for other stubs
df = df.rename(columns= dict((f't{i}', f'value_t{i}') for i in np.arange(1,4,1)))

pd.wide_to_long(df, stubnames=['pct', 'valid', 'value'], 
                i='id', j='test', suffix='.*', sep='_').reset_index()

Вывод:

            id test   pct  valid  value
0  66602088802   t1  0.46   True    car
1  85002620928   t1  0.51   True  house
2  66602088802   t2  0.15   True   bike
3  85002620928   t2  0.07   True    car
4  66602088802   t3  0.06  False    car
5  85002620928   t3  0.07  False    toy
0 голосов
/ 03 декабря 2018

Я не думаю, что wide_to_long может изменить то, что вам нужно, вы можете проверить с помощью melt

s=df.melt('id')
s=pd.concat([s,s.variable.str.split('_',expand=True)],1).fillna('value')
s.set_index(['id',0,1]).value.unstack().reset_index().rename(columns={0:'text'})
1           id text   pct  valid  value
0  66602088802   t1  0.46   True    car
1  66602088802   t2  0.15   True   bike
2  66602088802   t3  0.06  False    car
3  85002620928   t1  0.51   True  house
4  85002620928   t2  0.07   True    car
5  85002620928   t3  0.07  False    toy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...