Как заполнить пропущенные значения относительно значения из другого столбца - PullRequest
1 голос
/ 13 января 2020

Я хотел бы заполнить пропущенные значения условиями, относящимися к стране: например, я хотел бы заменить пропущенные значения в Китае средним значением возраста, а для США - медианой возраста. Пока я не хочу касаться отсутствующих ценностей ЕС. Как я мог понять это? Ниже фрейма данных

import pandas as pd
data = [['USA', ], ['EU', 15], ['China', 35],
       ['USA', 45], ['EU', 30], ['China', ],
       ['USA', 28], ['EU', 26], ['China', 78],
       ['USA', 65], ['EU', 53], ['China', 66],
       ['USA', 32], ['EU', ], ['China', 14]]  

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Country', 'Age'])
df.head(10)

  Country   Age
0     USA   NaN
1      EU  15.0
2   China  35.0
3     USA  45.0
4      EU  30.0
5   China   NaN
6     USA  28.0
7      EU  26.0
8   China  78.0
9     USA  65.0
10    EU    NaN

Спасибо

Ответы [ 3 ]

1 голос
/ 13 января 2020

Не уверен, что это лучший способ сделать это, но это один из способов сделать это

age_series = df['Age'].copy()
df.loc[(df['Country'] == 'China') & (df['Age'].isnull()), 'Age'] = age_series.mean()
df.loc[(df['Country'] == 'USA') & (df['Age'].isnull()), 'Age'] = age_series.median()

Обратите внимание, что я скопировал столбец age до того, как вы получили median исходной возрастной серии не после расчета среднего значения для США. Это окончательные результаты

    Country     Age
0   USA     33.500000
1   EU      15.000000
2   China   35.000000
3   USA     45.000000
4   EU      30.000000
5   China   40.583333
6   USA     28.000000
7   EU      26.000000
8   China   78.000000
9   USA     65.000000
10  EU      53.000000
11  China   66.000000
12  USA     32.000000
13  EU      NaN
14  China   14.000000
0 голосов
/ 13 января 2020

Может быть, вы можете попробовать это

df['Age']=(np.where((df['Country'] == 'China') & (df['Age'].isnull()),df['Age'].mean()
          ,np.where((df['Country'] == 'USA') & (df['Age'].isnull()),df['Age'].median(),df['Age']))).round()

Вывод

   Country  Age
0   USA     34.0
1   EU      15.0
2   China   35.0
3   USA     45.0
4   EU      30.0
5   China   41.0
6   USA     28.0
7   EU      26.0
8   China   78.0
9   USA     65.0
10  EU      53.0
11  China   66.0
12  USA     32.0
13  EU      NaN
14  China   14.0

0 голосов
/ 13 января 2020

IIU C, мы можем создать функцию для обработки этого, поскольку ее нелегко автоматизировать (хотя я могу ошибаться)

идея состоит в том, чтобы передать название страны и тип заполнения (то есть среднее значение медианы ) вы можете расширить функцию для добавления в ваши типы агг.

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

def missing_values(dataframe,country,fill_type):

    """
    takes 3 arguments, dataframe, country & fill_type:
    fill_type is the method used to fill `NA` values, mean, median, etc.
    """

    fill_dict = dataframe.loc[dataframe['Country'] == country]\
            .groupby("Country")["Age"].agg(
                    ["mean", "median"]).to_dict(orient='index')



    dataframe.loc[dataframe['Country'] == country, 'Age'] \
                 = dataframe['Age'].fillna(fill_dict[country][fill_type])
    return dataframe

print(missing_values(df,'China','mean')
    Country    Age
0      USA    NaN
1       EU  15.00
2    China  35.00
3      USA  45.00
4       EU  30.00
5    China  48.25
6      USA  28.00
7       EU  26.00
8    China  78.00
9      USA  65.00
10      EU  53.00
11   China  66.00
12     USA  32.00
13      EU    NaN
14   China  14.00

print(missing_values(df,'USA','median'))
   Country    Age
0      USA  38.50
1       EU  15.00
2    China  35.00
3      USA  45.00
4       EU  30.00
5    China  48.25
6      USA  28.00
7       EU  26.00
8    China  78.00
9      USA  65.00
10      EU  53.00
11   China  66.00
12     USA  32.00
13      EU    NaN
14   China  14.00
...