Как создать новый столбец для транспонированных данных

#python #pandas #pivot-table

Вопрос:

Я пытаюсь перенести строку в новый столбец, используя фрейм данных pandas. Идентификатор посещения-это уникальный идентификатор. Я использовал df.pivot и df.melt, но df.melt, похоже, делает обратное. Я довольно новичок в Python и начал с него, но я довольно растерян. Есть какие-нибудь предложения?

Входной ток:

Идентификатор посещения Код DX Страхование Первичный или вторичный
1 123 Этна Первичный
1 234 Близость Вторичный
2 456 ВНС Вторичный
2 789 Медицинская помощь Первичный

Желаемый Результат:

Идентификатор посещения Код DX Код DX 2 Первичный Вторичный
1 123 234 Этна Близость
2 456 789 Медицинская помощь ВНС
 import pandas as pd

df = pd.read_excel(r'C:UsersTEST.xlsx', sheet_name = 'Sheet1')

# pivot = df.pivot(index='Visit ID', columns='DX Code', values = 'DX ID')
# print(pivot)

# melt = df.melt(value_name='DX Code', var_name='DX Code2')
# print(melt)
 

Комментарии:

1. Как выглядит ваш фрейм входных данных?

2. Я отредактировал свой пост. Вместо «Текущий выход» я поставил «Текущий вход».

Ответ №1:

Вы можете использовать merge :

 out = pd.merge(df[df['Primary or Secondary'] == 'Primary'],
               df[df['Primary or Secondary'] == 'Secondary'],
               on='Visit ID', suffixes=('', '2'))
 

Остальное — просто переформатирование:

 out = out[['Visit ID', 'DX Code', 'DX Code2', 'Insurance', 'Insurance2']] 
          .rename(columns={'Insurance': 'Primary', 'Insurance2': 'Secondary'})
 
 >>> df
   Visit ID  DX Code  DX Code2   Primary Secondary
0         1      123       234     Aetna  Affinity
1         2      789       456  Medicare       VNS
 

Ответ №2:

Вы можете использовать datar , который использует pandas в качестве бэкенда, но реализует dplyr подобный синтаксис:

 >>> from datar.all import c, f, tribble, tibble, rep, paste0, pivot_wider
>>> 
>>> df = tribble(
...     f.Visit_ID, f.DX_Code, f.Insurance, f.Primary_or_Secondary,
...     1,          123,       "Aetna",     "Primary",
...     1,          234,       "Affinity",  "Secondary",
...     2,          456,       "VNS",       "Secondary",
...     2,          789,       "Medicare",  "Primary",
... )
>>> df
   Visit_ID  DX_Code Insurance Primary_or_Secondary
    <int64>  <int64>  <object>             <object>
0         1      123     Aetna              Primary
1         1      234  Affinity            Secondary
2         2      456       VNS            Secondary
3         2      789  Medicare              Primary

>>> # Create a new df with names and values
>>> df2 = tibble(
...     Visit_ID=rep(df.Visit_ID, 2),
...     name=c(paste0("DX Code", rep(c("", "2"), 2)), df.Primary_or_Secondary),
...     value=c(df.DX_Code, df.Insurance)
... )
>>> 
>>> df2
   Visit_ID       name     value
    <int64>   <object>  <object>
0         1    DX Code       123
1         1   DX Code2       234
2         2    DX Code       456
3         2   DX Code2       789
4         1    Primary     Aetna
5         1  Secondary  Affinity
6         2  Secondary       VNS
7         2    Primary  Medicare
>>> df2 >> pivot_wider()
   Visit_ID  DX Code DX Code2   Primary Secondary
    <int64> <object> <object>  <object>  <object>
0         1      123      234     Aetna  Affinity
1         2      456      789  Medicare       VNS
 

Отказ от ответственности: Я являюсь автором пакета datar.