【问题标题】:Replace NaN values with other values from same column用同一列中的其他值替换 NaN 值
【发布时间】:2023-03-03 01:10:02
【问题描述】:

我的 DF 是这样的

id    zip     location
X2    65123   Houston
T5    65123   Houston
A1    nan     Houston
M8    89517   Berkley
X3    89518   Berkley
N2    nan     Berkley
M9    nan     nan

对于“zip”中的某些值,我没有邮政编码,而是“位置”中的条目。
我想用来自同一位置的邮政编码之一填充“zip”中的 nan 值。有时有不止一种选择,例如对于 N2,有两个选项 89517 和 89518,选择哪一个并不重要。但我不想更改我在 zip 和位置中有 nan 的那些。我该怎么做?

【问题讨论】:

    标签: python pandas dataframe replace nan


    【解决方案1】:

    由于您不关心使用哪个值,我们可以使用max 值:

    >>> df['zip'] = df.groupby('location')['zip'].transform(lambda x: x.fillna(x.max())).astype(int)
    >>> df
    
       id    zip location
    0  X2  65123  Houston
    1  T5  65123  Houston
    2  A1  65123  Houston
    3  M8  89517  Berkley
    4  X3  89518  Berkley
    5  N2  89518  Berkley
    

    如果您需要处理ziplocation 都是NaNs 的情况,首先,过滤掉子组:

    >>> sub_df = df.loc[df[['zip', 'location']].notna().any(1)]
    >>> df
       id      zip location
    0  X2  65123.0  Houston
    1  T5  65123.0  Houston
    2  A1      NaN  Houston
    3  M7      NaN      NaN    # <-- added a line in between to show index is maintained
    4  M8  89517.0  Berkley
    5  X3  89518.0  Berkley
    6  N2      NaN  Berkley
    7  M9      NaN      NaN
    
    >>> sub_df
       id      zip location
    0  X2  65123.0  Houston
    1  T5  65123.0  Houston
    2  A1      NaN  Houston    # <-- No index 3
    4  M8  89517.0  Berkley
    5  X3  89518.0  Berkley
    6  N2      NaN  Berkley
    

    然后执行相同的操作(只是这次你不需要转换为int,因为无论如何你的框架中都会有NaNs):

    df['zip'] = sub_df.groupby('location')['zip'].transform(lambda x: x.fillna(x.max()))
    

    结果:

       id      zip location
    0  X2  65123.0  Houston
    1  T5  65123.0  Houston
    2  A1  65123.0  Houston
    3  M7      NaN      NaN
    4  M8  89517.0  Berkley
    5  X3  89518.0  Berkley
    6  N2  89518.0  Berkley
    7  M9      NaN      NaN
    

    【讨论】:

    • 由于 nan 在 zip 和 location 中的观察,无法正常工作。
    • 添加了子组处理。请查看更新的答案。
    • 我得到“TypeError: '>=' not supported between 'str' and 'float'”。如果我之前将 zip 转换为 str,“ValueError:长度不匹配:预期轴有 4937 个元素,新值有 5113 个元素”
    • 已解决:在 zip 中有一个带有 x 的观察结果!谢谢!!
    【解决方案2】:

    如果您不关心要填写哪个值,一种简单的方法是按位置和 zip 对表格进行排序,然后将 fillna 与 method='ffill' 一起使用

     >>> df
           zip location
    0  65123.0  Houston
    1  65123.0  Houston
    2      NaN  Houston
    3  89517.0  Berkley
    4  89518.0  Berkley
    5      NaN  Berkley
    
    >>> df.sort_values(by=['location','zip']).fillna(method='ffill')
           zip location
    3  89517.0  Berkley
    4  89518.0  Berkley
    5  89518.0  Berkley
    0  65123.0  Houston
    1  65123.0  Houston
    2  65123.0  Houston
    

    更新:下面的解决方案也在位置处理 nan。首先使用 groupby 函数,然后在组内按 max 填充。

    >>> df
           zip location
    0  65123.0  Houston
    1  65123.0  Houston
    2      NaN  Houston
    3  89517.0  Berkley
    4  89518.0  Berkley
    5      NaN  Berkley
    6      NaN      NaN
    
    >>> df['zip'] = df.groupby('location')['zip'].apply(lambda x:x.fillna(x.max()))
    >>> df
           zip location
    0  65123.0  Houston
    1  65123.0  Houston
    2  65123.0  Houston
    3  89517.0  Berkley
    4  89518.0  Berkley
    5  89518.0  Berkley
    6      NaN      NaN
    

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2018-04-30
      • 2021-10-25
      • 1970-01-01
      • 2021-12-09
      • 2021-10-28
      相关资源
      最近更新 更多