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

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

我正在使用Python中的Pandas DataFrame。

  1. File heat Farheit Temp_Rating
  2. 1 YesQ 75 N/A
  3. 1 NoR 115 N/A
  4. 1 YesA 63 N/A
  5. 1 NoT 83 41
  6. 1 NoY 100 80
  7. 1 YesZ 56 12
  8. 2 YesQ 111 N/A
  9. 2 NoR 60 N/A
  10. 2 YesA 19 N/A
  11. 2 NoT 106 77
  12. 2 NoY 45 21
  13. 2 YesZ 40 54
  14. 3 YesQ 84 N/A
  15. 3 NoR 67 N/A
  16. 3 YesA 94 N/A
  17. 3 NoT 68 39
  18. 3 NoY 63 46
  19. 3 YesZ 34 81

我需要用Farheit列中的值替换Temp_Rating列中的所有NaN。
这就是我需要的:

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

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

oewdyzsn

oewdyzsn1#

假设你的DataFrame在df中:

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

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

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

pprl5pva2#

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

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

6yt4nkrj3#

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

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

xqkwcwgp4#

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

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

返回:

  1. (1, File heat Farheit Temp
  2. 0 1 YesQ 75 NaN
  3. 1 1 NoR 115 NaN
  4. 2 1 NoT 63 13.0
  5. 3 2 YesT 43 71.0)
  6. (2, File heat Farheit Temp
  7. 0 1 YesQ 75 75.0
  8. 1 1 NoR 115 115.0
  9. 2 1 NoT 63 13.0
  10. 3 2 YesT 43 71.0)
展开查看全部
laik7k3q

laik7k3q5#

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

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

oaxa6hgo6#

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

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

pwuypxnk7#

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

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

相关问题