Панды расплавляют несколько групп в одну колонку - PullRequest
0 голосов
/ 09 июня 2018

Исходный фрейм данных:

+----+----------+----------+----------+----------+
| ID |  var1hrs |  var2hrs |  ind1var |  ind2var |
+----+----------+----------+----------+----------+
|  1 |       55 |       45 |      123 |      456 |
|  2 |       48 |       60 |      331 |      222 |
+----+----------+----------+----------+----------+

Целевой фрейм данных:

+----+------------+------+------+
| ID |    type    |  hrs |  ind |
+----+------------+------+------+
|  1 |  primary   |   55 |  123 |
|  1 |  secondary |   45 |  456 |
|  2 |  primary   |   48 |  331 |
|  2 |  secondary |   60 |  222 |
+----+------------+------+------+

Как бы мне было объединить несколько групп переменных в один столбец метки?«1» в именах переменных указывает на тип = «первичный», а «2» указывает на тип = «вторичный».

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

(комментарии вписаны)

# set ID as the index and sort columns
df = df.set_index('ID').sort_index(axis=1)

# extract primary columns
prim = df.filter(like='1')
prim.columns = ['ind', 'vars']
# extract secondary columns 
sec = df.filter(like='2')
sec.columns = ['ind', 'vars']

# concatenation + housekeeping
v = (pd.concat([prim, sec], keys=['primary', 'secondary'])
       .swaplevel(0, 1)
       .rename_axis(['ID', 'type'])
       .reset_index()
)

print(v)
   ID       type  ind  vars
0   1    primary  123    55
1   2    primary  331    48
2   1  secondary  456    45
3   2  secondary  222    60

Это более или менее эффективный способ сделать это, даже если шаги немного сложны.

0 голосов
/ 09 июня 2018

После изменения имени столбца мы можем использовать wide_to_long

df.columns=df.columns.str[:4]
s=pd.wide_to_long(df,['var','ind'],i='ID',j='type').reset_index()
s=s.assign(type=s.type.map({'1':'primary','2':'secondary'})).sort_values('ID')
s

   ID       type  var  ind
0   1    primary   55  123
2   1  secondary   45  456
1   2    primary   48  331
3   2  secondary   60  222
...