【问题标题】:Python Pandas replace NaN in one column with value from corresponding row of second columnPython Pandas 将一列中的 NaN 替换为第二列对应行的值
【发布时间】:2015-05-24 12:14:08
【问题描述】:

我正在 Python 中使用这个 Pandas DataFrame。

File    heat    Farheit Temp_Rating
   1    YesQ         75         N/A
   1    NoR         115         N/A
   1    YesA         63         N/A
   1    NoT          83          41
   1    NoY         100          80
   1    YesZ         56          12
   2    YesQ        111         N/A
   2    NoR          60         N/A
   2    YesA         19         N/A
   2    NoT         106          77
   2    NoY          45          21
   2    YesZ         40          54
   3    YesQ         84         N/A
   3    NoR          67         N/A
   3    YesA         94         N/A
   3    NoT          68          39
   3    NoY          63          46
   3    YesZ         34          81

我需要将 Temp_Rating 列中的所有 NaN 替换为 Farheit 列中的值。

这是我需要的:

File        heat    Temp_Rating
   1        YesQ             75
   1         NoR            115
   1        YesA             63
   1        YesQ             41
   1         NoR             80
   1        YesA             12
   2        YesQ            111
   2         NoR             60
   2        YesA             19
   2         NoT             77
   2         NoY             21
   2        YesZ             54
   3        YesQ             84
   3         NoR             67
   3        YesA             94
   3         NoT             39
   3         NoY             46
   3        YesZ             81

如果我进行布尔选择,我一次只能选择其中一列。问题是,如果我随后尝试加入他们,我将无法在保持正确顺序的同时做到这一点。

我怎样才能只找到带有NaNs 的Temp_Rating 行并将它们替换为Farheit 列的同一行中的值?

【问题讨论】:

    标签: python pandas dataframe nan fillna


    【解决方案1】:

    假设你的 DataFrame 在df:

    df.Temp_Rating.fillna(df.Farheit, inplace=True)
    del df['Farheit']
    df.columns = 'File heat Observations'.split()
    

    首先将任何NaN 值替换为df.Farheit 的对应值。删除'Farheit' 列。然后重命名列。这是生成的DataFrame

    【讨论】:

    • 如果两列数据类型都是对象,而不是 N/A,它是该行中的空单元格,如何处理?
    • 一种可能的考虑方法:您可以先将空字符串替换为NaN(参见here),然后使用this 方法。
    • 答案是完美的。如果您想更多地使用 pandas 语法,我建议您删除 df.drop("Farheit", axis=1) 的列,但这可能是个人喜好
    • @MichaelA 同意 drop 现在在 Pandas-land 中优先于 del。如果使用最近的 Pandas,建议使用 df = df.drop(columns='Farheit') 而非数字轴编号。
    【解决方案2】:

    上述解决方案对我不起作用。我使用的方法是:

    df.loc[df['foo'].isnull(),'foo'] = df['bar']
    

    【讨论】:

    • 它是引发异常还是根本不起作用?尝试 isna() 而不是 isnull()。
    【解决方案3】:

    解决这个问题的另一种方法,

    import pandas as pd
    import numpy as np
    
    ts_df = pd.DataFrame([[1,"YesQ",75,],[1,"NoR",115,],[1,"NoT",63,13],[2,"YesT",43,71]],columns=['File','heat','Farheit','Temp'])
    
    
    def fx(x):
        if np.isnan(x['Temp']):
            return x['Farheit']
        else:
            return x['Temp']
    print(1,ts_df)
    ts_df['Temp']=ts_df.apply(lambda x : fx(x),axis=1)
    
    print(2,ts_df)
    

    返回:

    (1,    File  heat  Farheit  Temp                                                                                    
    0     1  YesQ       75   NaN                                                                                        
    1     1   NoR      115   NaN                                                                                        
    2     1   NoT       63  13.0                                                                                        
    3     2  YesT       43  71.0)                                                                                       
    (2,    File  heat  Farheit   Temp                                                                                   
    0     1  YesQ       75   75.0                                                                                       
    1     1   NoR      115  115.0
    2     1   NoT       63   13.0
    3     2  YesT       43   71.0)
    

    【讨论】:

      【解决方案4】:

      @Jonathan 的回答很好,但是有点矫枉过正,就用pop

      df['Temp_Rating'] = df['Temp_Rating'].fillna(df.pop('Farheit'))
      

      【讨论】:

        【解决方案5】:

        接受的答案使用fillna(),它将填充两个数据框共享索引的缺失值。正如here 很好解释的那样,对于两个数据帧的索引不匹配的情况,您可以使用combine_first 来填充缺失值、行和索引值。

        df.Col1 = df.Col1.fillna(df.Col2) #fill in missing values if indices match
        
        #or 
        df.Col1 = df.Col1.combine_first(df.Col2) #fill in values, rows, and indices
        

        【讨论】:

        • 不错的答案。在这里的问题中,我没想到数据中有不重叠的索引,所以.filna() 就足够了。实际上,这里的重点是单个列 (Temp_Rating),其中 NaNs 出现在数据中,因此这两种方法 - .fillna()combine_first() - 最终产生了等效的输出。尽管如此,这是一种非常有用的方法。
        猜你喜欢
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多