Свертывание фрейма данных в соответствии с дублирующимися значениями столбца и удаление значений NaN - PullRequest
1 голос
/ 25 мая 2019

Я работаю с базой данных пациентов с несколькими лабораторными значениями, где каждая лаборатория получает свою собственную строку, даже если в одну и ту же дату. Я хотел бы свернуть строки, основанные на повторяющихся датах для каждого пациента, чтобы иметь одну строку на дату, которая содержит результаты всех лабораторий в этот день.

Я пробовал различные функции groupby() и pd.merge(), но безрезультатно.

Пример игрушки:

import pandas as pd
import numpy as np
PID = [1, 1, 1, 2, 2, 2]
ALC = [200, np.nan, np.nan, 300, np.nan, np.nan]
WBC = [np.nan, 1000, np.nan, np.nan, 2000, np.nan]
per_neut = [np.nan, np.nan, 0.64, np.nan, np.nan, 0.77]
date = ['11/1/18', '11/2/18', '11/2/18', '1/11/04', 
        '1/11/04','1/11/04']

prac_dict = {'PID':PID, 'date':date, 'ALC':ALC, 'WBC':WBC,
             'per_neut':per_neut}
pract_df = pd.DataFrame(prac_dict)

Это то, что у меня есть

print(pract_df)
   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0       NaN
2    1  11/2/18    NaN     NaN      0.64
3    2  1/11/04  300.0     NaN       NaN
4    2  1/11/04    NaN  2000.0       NaN
5    2  1/11/04    NaN     NaN      0.77

И вот что я хочу:

   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0      0.64
2    2  1/11/04  300.0  2000.0      0.77

Предложения очень приветствуются!

1 Ответ

0 голосов
/ 25 мая 2019

Если необходимо сначала не пропустить значения по группам в столбцах, используйте GroupBy.first:

df = pract_df.groupby(['PID','date'], as_index=False).first()
print (df)
   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0      0.64
2    2  1/11/04  300.0  2000.0      0.77

Но если необходимо дублировать значения по группам, например 50 в последней группе для столбца ALC, укажите агрегатную функцию, например sum, mean, если использовать first, второе значение будет потеряно:

PID = [1, 1, 1, 2, 2, 2]
ALC = [200, np.nan, np.nan, 300, np.nan, 50]
WBC = [np.nan, 1000, np.nan, np.nan, 2000, np.nan]
per_neut = [np.nan, np.nan, 0.64, np.nan, np.nan, 0.77]
date = ['11/1/18', '11/2/18', '11/2/18', '1/11/04', 
        '1/11/04','1/11/04']

prac_dict = {'PID':PID, 'date':date, 'ALC':ALC, 'WBC':WBC,
             'per_neut':per_neut}
pract_df = pd.DataFrame(prac_dict)
print (pract_df)
   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0       NaN
2    1  11/2/18    NaN     NaN      0.64
3    2  1/11/04  300.0     NaN       NaN
4    2  1/11/04    NaN  2000.0       NaN
5    2  1/11/04   50.0     NaN      0.77

df1 = pract_df.groupby(['PID','date'], as_index=False).sum(min_count=1)
print (df1)
   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0      0.64
2    2  1/11/04  350.0  2000.0      0.77

df2 = pract_df.groupby(['PID','date'], as_index=False).mean()
print (df2)
   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0      0.64
2    2  1/11/04  175.0  2000.0      0.77

df3 = pract_df.groupby(['PID','date'], as_index=False).first()
print (df3)
   PID     date    ALC     WBC  per_neut
0    1  11/1/18  200.0     NaN       NaN
1    1  11/2/18    NaN  1000.0      0.64
2    2  1/11/04  300.0  2000.0      0.77
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...