【问题标题】:How to fill missing values relative to a value from another column如何填充相对于另一列中的值的缺失值
【发布时间】:2020-01-13 00:49:09
【问题描述】:

我想用相对于国家/地区的条件填充缺失值: 例如,我想用 Age 的平均值替换中国的缺失值,而对于美国,它是 Age 的中位数。目前,我不想触及欧盟的缺失值。 我怎么能意识到呢? 数据框下方

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

谢谢

【问题讨论】:

  • 你的预期输出是什么?

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


【解决方案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

【讨论】:

    【解决方案2】:

    也许你可以试试这个

    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
    
    

    【讨论】:

      【解决方案3】:

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

      这个想法是传递国家名称和填充类型(即平均中位数),您可以扩展该函数以添加到您的 agg 类型中。

      它返回一个修改你的数据框,所以你可以用它把它分配回你的 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
      

      【讨论】:

        猜你喜欢
        • 2018-04-07
        • 1970-01-01
        • 2017-02-08
        • 2018-07-25
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多