Pandas dataframe fillna () มีบางคอลัมน์เท่านั้น


145

ฉันกำลังพยายามเติมค่าใด ๆ ในดาต้าดาต้าแพนด้าของ 0 สำหรับคอลัมน์ย่อยบางส่วนเท่านั้น

เมื่อฉันทำ:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

ผลลัพธ์:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

มันแทนที่ทุกNoneกับ0's สิ่งที่ฉันต้องการจะทำคือเพียงแทนที่Noneในคอลัมน์aและแต่ไม่bc

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

คำตอบ:


219

คุณสามารถเลือกคอลัมน์ที่คุณต้องการและทำได้โดยการมอบหมาย:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

ผลลัพธ์ที่ได้เป็นไปตามที่คาดไว้:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

ใช่นี่คือสิ่งที่ฉันต้องการ! ขอบคุณ. มีวิธีใดบ้างที่จะทำ inplace นี้? ดาต้าเฟรมเดิมของฉันค่อนข้างใหญ่
Sait

1
ผมไม่คิดว่าจะมีกำไรจากผลการดำเนินงานใด ๆ โดยการทำเช่นนี้ในสถานที่ที่คุณเขียนทับ DF orig อยู่ดี
EdChum

4
ที่ตั้งฟุ่มเฟือยที่นี่df[['a', 'b']] = df[['a','b']].fillna(value=0)จะยังคงใช้งานได้
EdChum

2
@EdChum มันไม่ได้สร้าง data frame ชั่วคราวและด้วยเหตุนี้จึงต้องใช้หน่วยความจำเพิ่มเติมในการทำเช่นนั้นหรือ (ฉันกังวลเกี่ยวกับความทรงจำมากกว่าความซับซ้อนของเวลา)
Sait

7
สำหรับการดำเนินการหลายอย่างinplaceจะยังคงทำงานกับสำเนา ฉันไม่รู้ว่าเป็นกรณีfillnaหรือไม่ ดูคำตอบนี้จากหนึ่งในนักพัฒนาหลักของแพนด้า
รูต

85

คุณสามารถใช้dict, fillnaมีค่าที่แตกต่างกันสำหรับคอลัมน์ที่แตกต่างกัน

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

หลังจากกำหนดมันกลับมา

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
เจ๋งจริงๆ Btw สำหรับ dict ที่คุณสามารถใช้ได้fromkeysถ้าคุณต้องการ +1
U10- ส่งต่อ

1
คำตอบ / ตัวอย่างจะชัดเจนขึ้นถ้าจริง ๆ แล้วมันแสดงค่าต่างกันสำหรับคอลัมน์ที่แตกต่างกัน
RufusVS

@RufusVS ถูกต้อง แต่ยังคงพยายามจับคู่เอาต์พุตที่คาดไว้
YOBEN_S

1
นี่เป็นทางออกที่ดีกว่าที่คำตอบที่ยอมรับเพราะหลีกเลี่ยงปัญหาการจัดทำดัชนีที่ถูกล่ามโซ่เช่นถ้าใช้กับdf.fillna({'a':0,'b':0}, inplace=True)
Alex

19

คุณสามารถหลีกเลี่ยงการทำสำเนาวัตถุโดยใช้วิธีการของ Wen และ inplace = True:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

ซึ่งให้ผลผลิต:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
ขณะนี้เป็นที่ถูกต้องหลีกเลี่ยงการสำเนาไม่จำเป็นต้องดี
jpp

7

นี่คือวิธีที่คุณสามารถทำได้ทั้งหมดในบรรทัดเดียว:

df[['a', 'b']].fillna(value=0, inplace=True)

รายละเอียด: df[['a', 'b']]เลือกคอลัมน์ที่คุณต้องการเติมค่า NaN สำหรับvalue=0บอกให้เติม NaN ด้วยศูนย์และinplace=Trueจะทำการเปลี่ยนแปลงแบบถาวรโดยไม่ต้องทำสำเนาของวัตถุ


7

ใช้คำตอบด้านบนสร้างคำเตือนเกี่ยวกับการเปลี่ยนแปลงสำเนาของชิ้น df สมมติว่าคุณมีคอลัมน์อื่นวิธีที่ดีกว่าคือการส่งพจนานุกรม:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)



0

บางครั้งไวยากรณ์นี้จะไม่ทำงาน:

df[['col1','col2']] = df[['col1','col2']].fillna()

ใช้สิ่งต่อไปนี้แทน:

df['col1','col2']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.