#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.