Заполните значения nan случайным значением из других панд DataFrame - PullRequest
0 голосов
/ 12 июня 2018

У меня есть DataFrame с миллионом строк и множеством значений NaN.Пример:

index     Company        Area
    0     Google         Technology
    1     Coca Cola      Drinks
    2     NaN            Drinks
    3     Apple          Technology
    4     NaN            Technology
    5     Gatorade       Drinks
    6     Dell           Technology
    7     Apple          Technology
    8     Coca Cola      Drinks
    9     NaN            Drinks
    10    Google         Technology

Моя идея состоит в том, чтобы заполнить значения NaN компаний одним из 2 наиболее распространенных значений для его области.

Из примера: если наиболее частыми компаниями в области технологий являются Apple и Google, я хотел бы заполнить значения NaN "df ['Area'] == 'Technology'" одним из этих значений (случайным образом)

Я уже создал DataFrame Group By с наиболее распространенными значениями, это примерно так:

Area          Company
Technology    Google
Technology    Apple
Drinks        Coca Cola
Drinks        Pepsi

Результат должен выглядеть примерно так:

index     Company        Area
    0     Google         Technology
    1     Coca Cola      Drinks
    2     Pepsi          Drinks
    3     Apple          Technology
    4     Google         Technology
    5     Gatorade       Drinks
    6     Dell           Technology
    7     Apple          Technology
    8     Coca Cola      Drinks
    9     Pepsi          Drinks
    10    Google         Technology

Надеюсь, вы мне поможете.

Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Настройка

import io

z=io.StringIO("""
Company        Area
Google         Technology
CocaCola      Drinks
NaN            Drinks
Apple          Technology
NaN            Technology
Gatorade       Drinks
Dell           Technology
Apple          Technology
CocaCola      Drinks
NaN            Drinks
Google         Technology""")

df = pd.read_table(z, delim_whitespace=True)

Затем вы можете сделать

t = df.groupby("Area").Company.value_counts()
s = t.groupby("Area").apply(lambda x: [(i[1]) for i,v in zip(x.index,x) if v==max(x)])

, где s - ряд с наиболее распространенными значениями.Пример:

>>> s
Area
Drinks             [CocaCola]
Technology    [Apple, Google]
Name: Company, dtype: object

Теперь используется random.choice

from random import choice
df2 = df.set_index("Area")
mask = df2.Company.isna()
df2.loc[mask, "Company"] = [choice(s[s.index == i].item()) for i in df2.loc[mask].index]
0 голосов
/ 12 июня 2018

Я придумаю это решение, используя random.choice

import random

s=df1.groupby('Area').Company.apply(list).reindex(df.Area).apply(lambda x :random.choice(x) )
s.index=df.index

df.Company=df.Company.fillna(s)

df
Out[200]: 
    index   Company        Area
0       0    Google  Technology
1       1  CocaCola      Drinks
2       2  CocaCola      Drinks
3       3     Apple  Technology
4       4    Google  Technology
5       5  Gatorade      Drinks
6       6      Dell  Technology
7       7     Apple  Technology
8       8  CocaCola      Drinks
9       9     Pepsi      Drinks
10     10    Google  Technology
...