Условное заполнение пустых значений в кадрах данных Pandas - PullRequest
0 голосов
/ 12 октября 2018

У меня есть datafarme, который выглядит следующим образом (есть больше столбцов, которые были удалены):

    memberID    shipping_country    
    264991      
    264991       Canada
    100          USA    
    5000         
    5000         UK

Я пытаюсь заполнить пустые ячейки 1005 * существующим значениемстраны доставки для каждого пользователя:

    memberID    shipping_country    
    264991       Canada
    264991       Canada
    100          USA    
    5000         UK
    5000         UK

Однако я не уверен, какой самый эффективный способ сделать это в крупномасштабном наборе данных.Возможно, используя векторный групповой метод?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Вы можете использовать GroupBy + ffill / bfill:

def filler(x):
    return x.ffill().bfill()

res = df.groupby('memberID')['shipping_country'].apply(filler)

Необходима пользовательская функция, поскольку нет комбинированного метода Панд для последовательного ffill и bfill.

Это также учитывает ситуацию, когда все значения NaN для конкретного memberID;в этом случае они останутся NaN.

0 голосов
/ 12 октября 2018

Для следующего примера кадра данных (я добавил группу memberID, которая содержит только '' в столбце shipping_country):

   memberID shipping_country
0    264991                 
1    264991           Canada
2       100              USA
3      5000                 
4      5000               UK
5        54                 

Это должно работать для вас, а также как поведениечто если группа memberID имеет только пустые строковые значения ('') в shipping_country, они будут сохранены в выходных данных df:

df['shipping_country'] = df.replace('',np.nan).groupby('memberID')['shipping_country'].transform('first').fillna('')

Выход:

   memberID shipping_country
0    264991           Canada
1    264991           Canada
2       100              USA
3      5000               UK
4      5000               UK
5        54                 

Если вы хотите оставить пустые строки '' как NaN в выводе df, просто удалите fillna(''), оставив:

df['shipping_country'] = df.replace('',np.nan).groupby('memberID')['shipping_country'].transform('first')
0 голосов
/ 12 октября 2018

Вы можете использовать цепочку groupby s, одну с прямой заливкой и одну с обратной засыпкой:

# replace blank values with `NaN` first:
df['shipping_country'].replace('',pd.np.nan,inplace=True)

df.iloc[::-1].groupby('memberID').ffill().groupby('memberID').bfill()

   memberID shipping_country
0    264991           Canada
1    264991           Canada
2       100              USA
3      5000               UK
4      5000               UK

Этот метод также позволит группе, состоящей из всех NaN, остаться NaN:

>>> df
   memberID shipping_country
0    264991                 
1    264991           Canada
2       100              USA
3      5000                 
4      5000               UK
5         1                 
6         1                 

df['shipping_country'].replace('',pd.np.nan,inplace=True)

df.iloc[::-1].groupby('memberID').ffill().groupby('memberID').bfill()

   memberID shipping_country
0    264991           Canada
1    264991           Canada
2       100              USA
3      5000               UK
4      5000               UK
5         1              NaN
6         1              NaN
...