изменить форму кадра данных с различными длинами строк - PullRequest
0 голосов
/ 30 октября 2018

У меня есть датафрейм в Python, который выглядит следующим образом:

ID    Value
001   0.5
001   0.2
001   0.5
001   0.0
002   0.4
002   0.6
002   0.6

Я бы хотел, чтобы данные были преобразованы в нечто вроде этого:

ID    Val1    Val2   Val3   Val4
001   0.5     0.2    0.5    0.0
002   0.4     0.6    0.6    NaN

Может кто-нибудь помочь с этим? Моей первой мыслью было расплавление данных с помощью «pivot», но без значения, обозначающего положение «Val», оно не работает, как предполагалось.

спасибо!

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Grouppby ваш ID, затем сбросьте индекс, чтобы столбцы были согласованными и unstack

df.groupby('ID')['Value'].apply(lambda df: df.reset_index(drop=True)).unstack()
      0    1    2    3
ID
1   0.5  0.2  0.5  0.0
2   0.4  0.6  0.6  NaN

ИЛИ не использовать ID в качестве индекса:

df.sort_values('ID').groupby('ID')['Value'].apply(lambda df: df.reset_index(drop=True)).unstack().reset_index()
  ID    0    1    2    3
0  1  0.5  0.2  0.5  0.0
1  2  0.4  0.6  0.6  NaN
0 голосов
/ 30 октября 2018

Это может сработать:

>>> df = pd.DataFrame({"id": ["001"]*4 + ["002"]*3, "value": [0.5, 0.2, 0.5, 0.0, 0.4, 0.6, 0.6]})
>>> df
    id  value
0  001    0.5
1  001    0.2
2  001    0.5
3  001    0.0
4  002    0.4
5  002    0.6
6  002    0.6
>>> pd.concat([pd.Series(list(g["value"]), name=x) for x, g in df.groupby("id")], axis=1).T
       0    1    2    3
001  0.5  0.2  0.5  0.0
002  0.4  0.6  0.6  NaN

Теперь вам нужно переименовать столбцы / строки.

0 голосов
/ 30 октября 2018

Вы можете assign индексировать серию, затем pivot:

res = df.assign(ValNum=df.groupby('ID').cumcount()+1)\
        .pivot(index='ID', columns='ValNum', values='Value')\
        .reset_index()

print(res)

ValNum  ID    1    2    3    4
0        1  0.5  0.2  0.5  0.0
1        2  0.4  0.6  0.6  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...