Python Pandas thay thế NaN trong một cột bằng giá trị từ hàng tương ứng của cột thứ hai


99

Tôi đang làm việc với Pandas DataFrame này bằng 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

Tôi cần thay thế tất cả các NaN trong Temp_Ratingcột bằng giá trị từ Farheitcột.

Đây là những gì tôi cần:

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

Nếu tôi thực hiện lựa chọn Boolean, tôi chỉ có thể chọn một trong các cột này tại một thời điểm. Vấn đề là nếu sau đó tôi cố gắng tham gia cùng họ, tôi không thể làm điều này trong khi vẫn giữ được thứ tự chính xác.

Làm cách nào để tôi chỉ có thể tìm Temp_Ratingcác hàng có chữ NaNs và thay thế chúng bằng giá trị trong cùng một hàng của Farheitcột?

Câu trả lời:


157

Giả sử DataFrame của bạn ở trong df:

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

Đầu tiên hãy thay thế bất kỳ NaNgiá trị nào bằng giá trị tương ứng của df.Farheit. Xóa 'Farheit'cột. Sau đó đổi tên các cột. Đây là kết quả DataFrame:

DataFrame kết quả


làm thế nào để làm việc với điều này nếu cả hai cột kiểu dữ liệu là đối tượng và thay vì N / A, nó là ô trống trong hàng đó?
ashish

Một cách tiếp cận có thể xem xét: Trước tiên, bạn có thể thay thế chuỗi trống bằng NaN(xem tại đây ) và sau đó sử dụng cách tiếp cận này .
edesz

Câu trả lời là hoàn hảo. Chỉ cần bạn muốn ở lại nhiều hơn trong cú pháp gấu trúc, tôi khuyên bạn nên xóa các cột theo df.drop("Farheit", axis=1), nhưng đó có thể là sở thích cá nhân
MichaelA

1
@MichaelA Đồng ý drophiện được ưu tiên delở Pandas-land. Nếu sử dụng một con gấu trúc gần đây, sẽ đề xuất df = df.drop(columns='Farheit')hơn đánh số trục số.
Jonathan Eunice ngày

35

Các giải pháp được đề cập ở trên đã không làm việc cho tôi. Phương pháp tôi đã sử dụng là:

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

3
Nó đã nêu ra một ngoại lệ hoặc đơn giản là không hoạt động? Hãy thử isna () thay vì isnull ().
RufusVS

3

Một cách khác để giải quyết vấn đề này,

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)

trả lại:

(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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.