Транспонировать строки в столбец, в то же время выравнивая фрейм данных на основе группы - PullRequest
1 голос
/ 25 сентября 2019

У меня есть следующий фрейм данных ...

idx Group      key     value  Time     IsTrue  
1   bicycle    person  yes    9:30      yes         
2   bicycle    name    bob    9:30      yes         
3   bicycle    alive   yes    9:30      yes            
5   non-cycle  person  no     1:30      no      
6   non-cycle  name    jack   1:30      no               

И я хочу получить следующий результат из фрейма данных

idx Group       Time  IsTrue person name  alive
1   bicycle     9:30  yes    yes    bob   yes
2   non-cycle   1:30  no     no     jack  NA

Где ключевые столбцы становятся новыми столбцами, а значения -строки для этих новых столбцов.Все остальные строки имеют одинаковые значения и всегда имеют одинаковые значения, за исключением столбцов ключа и значения.Ключи меняются, поэтому я собираюсь что-то динамичное.

Мое текущее решение использует pandas groupby & apply (на основе столбца Group) и создает новый фрейм данных для каждой группы, но это выглядит несколько сложнее.Есть ли более простые решения для этого?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

изменить :
, как вы фиксировали вывод.Я добавил другое решение, используя set_index и unstack

df.set_index(['Group', 'Time', 'IsTrue', 'key'])['value'].unstack().reset_index()

Out[503]:
key      Group  Time IsTrue alive  name person
0      bicycle  9:30    yes   yes   bob    yes
1    non-cycle  1:30     no   NaN  jack     no

Оригинал:
Ваш желаемый результат сбивает с толку.Давайте попробуем это решение, если это то, что вы хотите.Если это не так, я буду удалять его

df.pivot_table(index=['Group', 'Time', 'IsTrue'], columns='key', values='value', aggfunc='first').reset_index()

Out[487]:
key      Group  Time IsTrue alive  name person
0      bicycle  9:30    yes   yes   bob    yes
1    non-cycle  1:30     no   NaN  jack     no
1 голос
/ 25 сентября 2019

IN:

df = pd.read_clipboard()

pivot = df[['key', 'value', 'Group']].pivot(index='Group',columns='key').droplevel(0, axis=1).reset_index()
df.drop(['idx','key', 'value'], axis=1, inplace=True)

df = df.merge(pivot, on='Group').drop_duplicates().reset_index(drop=True)

OUT:

|   | Group     | Time | IsTrue | alive | name | person |
|---|-----------|------|--------|-------|------|--------|
| 0 | bicycle   | 9:30 | yes    | yes   | bob  | yes    |
| 1 | non-cycle | 1:30 | no     | NaN   | jack | no     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...