Как правильно использовать dataframe.lo c для вызова записей, содержащих пропущенные данные - PullRequest
1 голос
/ 21 марта 2020

Я смотрю набор данных Titani c и извлек информацию о том, на какой палубе находилась кабина пассажира, исходя из номера кабины. Большинство данных номера кабины отсутствовало, поэтому, когда я ввожу joint_df.Deck.isnull().value_counts(), я получаю следующее:

True     1137
False     379

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

choice_dict = {
    1: [['A', 'B', 'C', 'D', 'E'],
        [.12, .22, .32, .20, .14]],
    2: [['D', 'E', 'F'], 
        [.16, .34, .50]],
    3: [['E', 'F', 'G'],
        [1/3, 1/3, 1/3]]
}

Я думал о том, чтобы перебрать классы билетов (1-й, 2-й, 3-й) с отсутствующей информацией «Палуба» и заполнить эту недостающую информацию с помощью numpy.random.choice. Моя попытка сделать это выглядит следующим образом:

for key, value in choice_dict.items():
    pclass = key
    choices = value[0]
    probs = value[1]    
    num = len(joint_df.loc[joint_df.Pclass == key & joint_df.Deck.isnull(), 'Deck'])
    fill_in = np.random.choice(choices, size=num, p=probs)
    print("Pclass: ", pclass)
    print("num missing vals: ", num)
    print("fill ins: ", fill_in)

Однако я заметил, что я получаю только 72 пропущенных значения в 1-м классе и 72 пропущенных значения в 3-м классе без пропущенных значений во 2-м классе.

Это не добавляет к 1137 пропущенным значениям, которые мне нужно заполнить.

Я предполагаю, что моя проблема заключается в том, как я пытаюсь использовать Pandas.DataFrame.loc ...

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

1 Ответ

1 голос
/ 21 марта 2020

Поскольку приоритетные операторы необходимы, добавьте отсутствующие парантезы для (joint_df.Pclass == key):

for key, value in choice_dict.items():
    pclass = key
    choices = value[0]
    probs = value[1] 
    m = (joint_df.Pclass == key) & joint_df.Deck.isnull()
    num = len(joint_df.loc[m, 'Deck'])
    #alternative
    #num = m.sum()
    fill_in = np.random.choice(choices, size=num, p=probs)
    joint_df.loc[m, 'Deck'] = fill_in

Образец :

import seaborn as sns

joint_df = sns.load_dataset('titanic').rename(columns = lambda x: x.capitalize())
print (joint_df.head())
   Survived  Pclass     Sex   Age  Sibsp  Parch     Fare Embarked  Class  \
0         0       3    male  22.0      1      0   7.2500        S  Third   
1         1       1  female  38.0      1      0  71.2833        C  First   
2         1       3  female  26.0      0      0   7.9250        S  Third   
3         1       1  female  35.0      1      0  53.1000        S  First   
4         0       3    male  35.0      0      0   8.0500        S  Third   

     Who  Adult_male Deck  Embark_town Alive  Alone  
0    man        True  NaN  Southampton    no  False  
1  woman       False    C    Cherbourg   yes  False  
2  woman       False  NaN  Southampton   yes   True  
3  woman       False    C  Southampton   yes  False  
4    man        True  NaN  Southampton    no   True 

for key, value in choice_dict.items():
    pclass = key
    choices = value[0]
    probs = value[1] 
    m = (joint_df.Pclass == key) & joint_df.Deck.isnull()
    num = m.sum()
    fill_in = np.random.choice(choices, size=num, p=probs)
    joint_df.loc[m, 'Deck'] = fill_in

print (joint_df.Deck.isnull().value_counts())    
False    891
Name: Deck, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...