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

bwntbbo3  于 2023-09-29  发布在  其他
关注(0)|答案(7)|浏览(105)

我正在使用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

我需要用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

如果我执行布尔选择,我一次只能选择这些列中的一个。问题是,如果我尝试加入它们,我无法在保持正确顺序的同时做到这一点。
如何只找到NaN s的Temp_Rating行,并将它们替换为Farheit列的同一行中的值?

oewdyzsn

oewdyzsn1#

假设你的DataFrame在df中:

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

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

File  heat  Observations
0      1  YesQ            75
1      1   NoR           115
2      1  YesA            63
3      1   NoT            41
4      1   NoY            80
5      1  YesZ            12
6      2  YesQ           111
7      2   NoR            60
8      2  YesA            19
9      2   NoT            77
10     2   NoY            21
11     2  YesZ            54
12     3  YesQ            84
13     3   NoR            67
14     3  YesA            94
15     3   NoT            39
16     3   NoY            46
17     3  YesZ            81
pprl5pva

pprl5pva2#

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

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

6yt4nkrj3#

@Jonathan的答案很好,但有点矫枉过正,就用pop吧:

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

xqkwcwgp4#

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

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)
laik7k3q

laik7k3q5#

您也可以使用mask,它将Temp_RatingNaN 的值替换为列Farheit

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

oaxa6hgo6#

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

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
pwuypxnk

pwuypxnk7#

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

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)

相关问题