PythonPandas 将一列中的 NaN 替换为第二列相应行中的值

我使用的是 Python 中的熊猫数据框架。

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

我需要用来自 Farheit列的值替换 Temp_Rating列中的所有 NaN。

这就是我需要的:

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

如果我做一个布尔选择,我一次只能选出这些列中的一个。问题是,如果我然后试图加入他们,我不能做到这一点,同时保持正确的顺序。

我如何才能只找到 Temp_Rating行的 NaN和取代他们的值在同一行的 Farheit列?

174892 次浏览

假设你的数据框架在 df中:

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

首先用相应的 df.Farheit值替换任何 NaN值。删除 'Farheit'列。然后重命名列。下面是由此产生的 DataFrame:

resulting DataFrame

上面提到的方法对我不起作用,我使用的方法是:

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

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

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)

接受的答案使用 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

@ 乔纳森的回答很好,但有点过了,用 pop吧:

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

您还可以使用 mask,它将 Temp_Rating的值替换为 Farheit列:

df['Temp_Rating'] = df['Temp_Rating'].mask(df['Temp_Rating'].isna(), df['Farheit'])

来得很晚,但我遇到了一个类似的问题,这是我如何解决它,似乎对我来说更简洁一点... 希望它适用于每个人在类似的情况下

def function_a (row):
if row['Temp_Rating'] is None :
val = print(row['Farheit'])
return val
df['Temp_Rating'] = df.apply(function_a, axis=1)
df1= df.drop([Farheit], axis=1)