如何相对于另一列中的值填充缺失值

时间:2020-01-13 00:49:09

标签: python-3.x pandas missing-data

我想用与国家/地区有关的条件来填充缺失的值: 例如,我想用年龄的平均值代替中国的缺失值,而在美国,这是年龄的中位数。目前,我不想触及欧盟缺失的价值观。 我该怎么实现呢? 在数据框下方

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 个答案:

答案 0 :(得分:1)

不确定这是否是最好的方法,但这是一种方法

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

答案 1 :(得分:0)

IIUC,我们可以创建一个函数来处理此问题,因为它不容易自动化(尽管我可能错了)

想法是传入国家名称和填充类型(即中位数),您可以扩展该功能以添加agg类型。

它返回一个修改您的数据框,因此您可以使用它来将其分配回您的

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

答案 2 :(得分:0)

也许您可以尝试这个

tp < (char *) (&mp->s + 1)

输出

mp->s