Вперед или обратно заполнить значения NaN в столбцах Pandas на основе группировки других столбцов - PullRequest
0 голосов
/ 12 июля 2019

У меня есть датафрейм, как показано ниже:

import pandas as pd

df = pd.DataFrame({'Country':['USA','USA','MEX','IND','UK','UK','UK'],
                   'Region':['Americas','NaN','NaN','Asia','Europe','NaN','NaN'],
                   'Flower':['Rose','Rose','Lily','Orchid','Dandelion','Dandelion','Dandelion'],
                   'Animal':['Bison','NaN','Golden Eagle','Tiger','Lion','Lion','NaN'],
                   'Game':['Baseball','Baseball','soccer','hockey','cricket','cricket','cricket']})

Я хочу сгруппировать по Country и Flower и выполнить прямое или обратное заполнение столбцов Region и Animal, где отсутствуют значения. Однако столбец Game должен остаться без изменений

Я пробовал это, но это не сработало:

df['Region'] = df.groupby(['Country','Flower'])['Region'].transform(lambda x: x.ffill())

также:

df.groupby(['Country','Flower'])['Animal', 'Region'].isna().bfill()

Я хочу знать, как это сделать.

пока это работает, но убирает столбец Игры:

df=df.replace({'NaN':np.nan}) df.groupby(['Country','Flower'])['Animal', 'Region'].bfill().ffill()

И если я сделаю преобразование, то будет несоответствие длины. Также обратите внимание, что это примерный фрейм данных, в котором я добавил «NaN» в виде строки в исходном фрейме как np.nan.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Если вы измените код вашего фрейма данных, чтобы фактически включить np.nan s, то предоставленный вами код на самом деле работает. Хотя nans отображаются как обычный текст 'Nan', вы не можете создать фрейм данных, записывающий этот текст вручную, потому что он будет интерпретироваться как строка, а не как фактическое пропущенное значение.

import pandas as pd
import numpy as np

df = pd.DataFrame({'Country':['USA','USA','MEX','IND','UK','UK','UK'],
                   'Region':['Americas',np.nan,np.nan,'Asia','Europe',np.nan,np.nan],
                   'Flower':['Rose','Rose','Lily','Orchid','Dandelion','Dandelion','Dandelion'],
                   'Animal':['Bison',np.nan,'Golden Eagle','Tiger','Lion','Lion','NaN'],
                   'Game':['Baseball','Baseball','soccer','hockey','cricket','cricket','cricket']})

Тогда это:

df['Region'] = df.groupby(['Country','Flower'])['Region'].transform(lambda x: x.ffill())

на самом деле дает это:

         Animal Country     Flower      Game    Region
0         Bison     USA       Rose  Baseball  Americas
1           NaN     USA       Rose  Baseball  Americas
2  Golden Eagle     MEX       Lily    soccer       NaN
3         Tiger     IND     Orchid    hockey      Asia
4          Lion      UK  Dandelion   cricket    Europe
5          Lion      UK  Dandelion   cricket    Europe
6           NaN      UK  Dandelion   cricket    Europe
0 голосов
/ 12 июля 2019

Во-первых, вам нужно знать, 'NaN' - это не NaN

df=df.replace({'NaN':np.nan})
df.groupby(['Country','Flower'])['Region'].ffill()
Out[109]: 
0    Americas
1    Americas
2         NaN# since here only have single row , that why stay NaN
3        Asia
4      Europe
5      Europe
6      Europe
Name: Region, dtype: object

Во-вторых, если вам нужно объединить две функции iid в pandas, вам нужно apply

df.update(df.groupby(['Country','Flower'])['Animal', 'Region'].apply(lambda x : x.bfill().ffill()))                               
df
Out[119]: 
         Animal Country     Flower      Game    Region
0         Bison     USA       Rose  Baseball  Americas
1         Bison     USA       Rose  Baseball  Americas
2  Golden Eagle     MEX       Lily    soccer       NaN
3         Tiger     IND     Orchid    hockey      Asia
4          Lion      UK  Dandelion   cricket    Europe
5          Lion      UK  Dandelion   cricket    Europe
6          Lion      UK  Dandelion   cricket    Europe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...