Python транспонировать строки по уникальному идентификатору - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий df:

    Name    ID  Birth_date  Age
0   John    BE2 18/05/2011 06:45    22
1   John    BE1 18/05/2011 06:55    21
2   John    DE1 18/05/2011 03:11    42
3   Amanda  BE2 18/05/2011 04:44    35
4   Amanda  BE1 18/05/2011 06:08    25
5   Amanda  DE1 18/05/2011 12:08    36

Чего я хочу достичь:

  Name        BE2                       BE1           DE1
0  John 18/05/2011 06:45    18/05/2011 06:55    18/05/2011 03:11
1  Age         22                        21            42
2  Amanda   18/05/2011 04:44    18/05/2011 06:08    18/05/2011 12:08
3  Age         35                        25            36

Как я могу реструктурировать свой df?Я попытался транспонировать ID с помощью strip, но это не дает мне то, что я хочу:

strip_df=df_strip.set_index('ID').T



  ID             BE2    BE1      DE1        BE2     BE1       DE1
  NAME          John    John    John      Amanda    Amanda    Amanda
  AGE            22      21       42        35       25        36
  Birth_date    18...   18...     18...    18...-   18...      18...

Другое решение - хранить каждое значение отдельно и передавать его, но это не умно и не довольно глупо :).Я новичок в Python и не знаю точно, как добраться до моего результата.

1 Ответ

0 голосов
/ 11 мая 2018

Я думаю, вы можете использовать set_index с stack и unstack для изменения формы:

df = df_strip.set_index(['Name','ID']).stack().unstack(1)
#create one column from MultiIndex with join
df.index = df.index.map('_'.join)
df = df.rename_axis('ID').rename_axis(None, 1).reset_index()
print (df)
                  ID               BE1               BE2               DE1
0  Amanda_Birth_date  18/05/2011 06:08  18/05/2011 04:44  18/05/2011 12:08
1         Amanda_Age                25                35                36
2    John_Birth_date  18/05/2011 06:55  18/05/2011 06:45  18/05/2011 03:11
3           John_Age                21                22                42

#create new columns by names and values 
df = df_strip.set_index(['Name','ID']).stack().unstack(1)
df = df.rename_axis(('Name','Type')).rename_axis(None, 1).reset_index()
print (df)
     Name        Type               BE1               BE2               DE1
0  Amanda  Birth_date  18/05/2011 06:08  18/05/2011 04:44  18/05/2011 12:08
1  Amanda         Age                25                35                36
2    John  Birth_date  18/05/2011 06:55  18/05/2011 06:45  18/05/2011 03:11
3    John         Age                21                22                42

А для вашего точно выхода:

df = df_strip.set_index(['Name','ID']).stack().unstack(1)
df.index = ['{}'.format(i) if j == 'Birth_date' else '{}'.format(j) for i, j in df.index]
df = df.rename_axis('Name').rename_axis(None, 1).reset_index()
print (df)
     Name               BE1               BE2               DE1
0  Amanda  18/05/2011 06:08  18/05/2011 04:44  18/05/2011 12:08
1     Age                25                35                36
2    John  18/05/2011 06:55  18/05/2011 06:45  18/05/2011 03:11
3     Age                21                22                42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...