Python Pandas将NaN替换为一列中的NaN,其值来自第二列的相应行

ede*_*esz 67 nan dataframe python-2.7 pandas

我在Python 2.7中使用这个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
Run Code Online (Sandbox Code Playgroud)

我需要用Temp_Rating列中的值替换列中的所有NaN Farheit.

这就是我需要的:

File        heat    Observation
   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
Run Code Online (Sandbox Code Playgroud)

如果我进行布尔选择,我一次只能选出其中一列.问题是如果我然后尝试加入它们,我在保留正确的顺序时无法做到这一点.

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

Jon*_*ice 99

假设您的DataFrame位于df:

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

首先用NaN相应的值替换任何值df.Farheit.删除'Farheit'列.然后重命名列.结果DataFrame如下:

结果DataFrame

  • @MichaelA 同意在 Pandas-land 中,“drop”现在比“del”更受欢迎。如果使用最近的 Pandas,建议使用“df = df.drop(columns='Farheit')”而不是数值轴编号。 (2认同)

U10*_*ard 19

@Jonathan 的答案很好,但是有点过分了,只需使用pop

df['Temp_Rating'] = df['Temp_Rating'].fillna(df.pop('Farheit'))
Run Code Online (Sandbox Code Playgroud)


zsa*_*512 17

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

df.loc[df['foo'].isnull(),'foo'] = df['bar']
Run Code Online (Sandbox Code Playgroud)

  • 它是否引发异常或根本不起作用?尝试 isna() 而不是 isnull()。 (3认同)

rac*_*hwa 6

您还可以使用which 替换列中的mask值,其中Temp_Ratingis NaNFarheit

df['Temp_Rating'] = df['Temp_Rating'].mask(df['Temp_Rating'].isna(), df['Farheit'])
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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)
Run Code Online (Sandbox Code Playgroud)

返回:

(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)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 5

接受的答案使用fillna()它将填充两个数据帧共享索引的缺失值。正如这里很好地解释的那样,在两个数据帧的索引不匹配的情况下,您可以使用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
Run Code Online (Sandbox Code Playgroud)