Как мне объединить несколько строк в Dataframe, когда некоторые значения столбцов пусты? - PullRequest
3 голосов
/ 07 августа 2020

У меня такой фрейм данных: изменены метки для публикации: вы можете это видеть. SSN, студенческий билет и водительские права будут уникальными. Как мне это сделать в Python (PD / NP)

Name    SSN     Student_ID   DrivingLicenseNumber

Smith   None    1234         DL1234
Smith   None    None         DL1234
Smith   2222    1234         None     
None    2222    None         None     

Вы можете заметить, что для Simith не все значения представлены в каждой строке. Я пытаюсь получить одну строку для кузнеца, как показано ниже. Будем очень признательны за любые указатели. Я знаю, что могу загрузить в MySQL и сделать это, но не могу найти лучший способ в DF.

None    SSN    Student_ID    DrivingLicenseNumber
Smith   2222   1234          DL1234

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Используйте groupby.first с mask:

df.mask(df.eq('None')|df.eq(None)).groupby('Name').first()

Здесь не уверен, что 'None' - это строка или None. Если вы уверены, что можете использовать условие вместо обоих в маске.

Вы также можете попробовать:

df = df.mask(df.eq('None')|df.eq(None))
df = df.fillna(df.groupby('SSN').transform('ffill'))
df = df.fillna(df.groupby('Name').transform('ffill'))
df = df.fillna(df.groupby('Student_ID').transform('ffill'))
df = df.groupby('Name').first()
0 голосов
/ 07 августа 2020

Найдите и сдвиньте максимальный индекс, не равный нулю, и отбросьте любой столбец с нулевым значением.

 df.apply(lambda x:x.shift(-(x.notna().idxmax()))).dropna(thresh=4)
  
  Name    SSN    Student_ID      DrivingLicenseNumber
0  Smith  2222       1234               DL1234
0 голосов
/ 07 августа 2020

Мы можем попробовать сопоставить каждый уникальный ключ с другими. Например, двойной l oop выглядит так:

# map the string `None` to nan if necessary
df = df.mask(df=='None', np.nan)

keys = ['SSN', 'Student_ID','DrivingLicenseNumber']
for k in keys:
    maps = df.dropna(subset=[k]).groupby(k).first()
    for c in keys:
        if c == k: continue
        df[c] = df[c].fillna(df[k].map(maps[c]))

После этого фрейм данных будет выглядеть так:

    Name   SSN Student_ID DrivingLicenseNumber
0  Smith  2222       1234               DL1234
1  Smith  2222       1234               DL1234
2  Smith  2222       1234               DL1234
3    NaN  2222       1234               DL1234

Из которого мы можем использовать любой уникальный ключ чтобы сбросить дубликаты:

df.groupby('SSN').first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...