Python Pandas แทนที่ NaN ในคอลัมน์เดียวด้วยค่าจากแถวที่สองของคอลัมน์ที่เกี่ยวข้อง


97

ฉันกำลังทำงานกับ Pandas DataFrame นี้ใน 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

ฉันต้องการแทนที่ NaN ทั้งหมดในTemp_Ratingคอลัมน์ด้วยค่าจากFarheitคอลัมน์

นี่คือสิ่งที่ฉันต้องการ:

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แถวที่มีNaNs และแทนที่ด้วยค่าในแถวเดียวกันของFarheitคอลัมน์ได้อย่างไร

คำตอบ:


156

สมมติว่า DataFrame ของคุณอยู่ในdf:

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

ก่อนอื่นให้แทนที่NaNค่าใด ๆด้วยค่าที่สอดคล้องกันของdf.Farheit. ลบ'Farheit'คอลัมน์ จากนั้นเปลี่ยนชื่อคอลัมน์ นี่คือผลลัพธ์DataFrame:

DataFrame ที่เป็นผลลัพธ์


วิธีการทำงานกับสิ่งนี้หากทั้งสองคอลัมน์ประเภทข้อมูลเป็นวัตถุและแทนที่จะเป็น N / A มันเป็นเซลล์ว่างในแถวนั้น?
ashish

วิธีการหนึ่งที่เป็นไปได้ที่จะต้องพิจารณา: ก่อนอื่นคุณสามารถแทนที่สตริงที่ว่างเปล่าโดยNaN(ดูที่นี่ ) และจากนั้นใช้นี้วิธีการ
edesz

คำตอบคือสมบูรณ์แบบ ถ้าคุณต้องการใช้ไวยากรณ์แพนด้ามากขึ้นฉันขอแนะนำให้ลบคอลัมน์โดยdf.drop("Farheit", axis=1)แต่นั่นอาจเป็นความชอบส่วนตัว
MichaelA

1
@MichaelA เห็นด้วยdropตอนนี้ชอบdelใน Pandas-land หากใช้ Pandas ล่าสุดขอแนะนำให้ใช้การกำหนดdf = df.drop(columns='Farheit')หมายเลขแกนตัวเลข
Jonathan Eunice

35

วิธีแก้ปัญหาดังกล่าวข้างต้นไม่ได้ผลสำหรับฉัน วิธีที่ฉันใช้คือ:

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

3
มันทำให้เกิดข้อยกเว้นหรือไม่ได้ผล? ลองใช้ isna () แทน isnull ()
RufusVS

3

อีกวิธีหนึ่งในการแก้ปัญหานี้

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.