แทนที่ None ด้วย NaN ในดาต้าเฟรมของแพนด้า


99

ฉันมีโต๊ะx:

        website
0   http://www.google.com/
1   http://www.yahoo.com
2   None

ฉันต้องการแทนที่ python None ด้วยแพนด้า NaN ฉันเหนื่อย:

x.replace(to_replace=None, value=np.nan)

แต่ฉันได้รับ:

TypeError: 'regex' must be a string or a compiled regular expression or a list or dict of strings or regular expressions, you passed a 'bool'

ฉันควรจะทำอย่างไร

คำตอบ:


145

คุณสามารถใช้DataFrame.fillnaหรือSeries.fillnaที่จะเข้ามาแทนที่วัตถุหลามไม่สตริงNone'None'

import pandas as pd
import numpy as np

สำหรับดาต้าเฟรม:

df = df.fillna(value=np.nan)

สำหรับคอลัมน์หรือซีรี่ส์:

df.mycol.fillna(value=np.nan, inplace=True)

3
หากคุณนำเข้าข้อมูลจากฐานข้อมูล SQL คุณสามารถรวมเข้ากับคำตอบด้านล่าง สิ่งนี้จะแปลง None (ซึ่งไม่ใช่สตริง) เป็น NaN จากนั้นคุณสามารถdf['column'].replace(nan, "", inplace=True)บอกได้ว่าคุณต้องการให้ไม่มีเป็นสตริงว่างเปล่า
VISQL

1
คำตอบนี้ไม่ได้ผลสำหรับฉัน Noneมันไม่ได้เปลี่ยน คำตอบของ Max ได้ผล
Daniel

df['website'].replace(pd.np.nan, 0, inplace=True)ผมพบว่าวิธีการแก้ปัญหาเฉพาะคอลัมน์นี้จะมีประสิทธิภาพมากที่สุด: นอกจากนี้ยังไม่จำเป็นต้องรวม Numpy โดยอาศัยข้อมูลอ้างอิงในตัวของ Pandas
CodeMantle

2
pd.np.nanFutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly insteadตอนนี้จะช่วยให้
Alex Povel

16

นี่เป็นอีกทางเลือกหนึ่ง:

df.replace(to_replace=[None], value=np.nan, inplace=True)

3
โปรดระวังเมื่อคุณเรียกใช้ df.replace ([None], np.nan, inplace = True) สิ่งนี้จะเปลี่ยนอ็อบเจ็กต์วันที่และเวลาทั้งหมดที่ไม่มีข้อมูลเป็นอ็อบเจ็กต์ dtypes ดังนั้นตอนนี้คุณอาจมีการสืบค้นที่ไม่สมบูรณ์เว้นแต่คุณจะเปลี่ยนกลับเป็นวันที่และเวลาซึ่งอาจต้องเสียภาษีขึ้นอยู่กับขนาดของข้อมูลของคุณ
Doubledown

15

บรรทัดต่อไปนี้แทนที่Noneด้วยNaN:

df['column'].replace('None', np.nan, inplace=True)

เพียงตรวจสอบอีกครั้งก็ใช้ได้ผลสำหรับฉัน คุณได้รับข้อผิดพลาดหรือไม่หรือค่า "ไม่มี" ไม่ถูกแทนที่
Max Izadi

หมายเหตุ: วิธีนี้ใช้np.nanซึ่งมีประเภทลอย (เช่น :) float64ซึ่งตรงข้ามกับประเภทค่าเริ่มต้นของแพนด้าobjectสำหรับคอลัมน์นาโน
tehfink

6
โปรดทราบ: สิ่งนี้จะแทนที่สตริงด้วยข้อความ "ไม่มี" แต่ไม่ใช่ค่าที่ชัดเจนไม่มี ( ไม่มีในค่าคงที่ )
Gregor Müllegger

4

หากคุณใช้ df.replace ([None], np.nan, inplace = True) สิ่งนี้จะเปลี่ยนอ็อบเจ็กต์วันที่และเวลาทั้งหมดที่ไม่มีข้อมูลเป็นอ็อบเจ็กต์ dtypes ดังนั้นตอนนี้คุณอาจมีการสืบค้นที่ไม่สมบูรณ์เว้นแต่คุณจะเปลี่ยนกลับเป็นวันที่และเวลาซึ่งอาจต้องเสียภาษีขึ้นอยู่กับขนาดของข้อมูลของคุณ

หากคุณต้องการใช้วิธีนี้ก่อนอื่นคุณสามารถระบุฟิลด์ dtype ของวัตถุใน df ของคุณจากนั้นแทนที่ไม่มี:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)

0
DataFrame['Col_name'].replace("None", np.nan, inplace=True)

1
สวัสดีและยินดีต้อนรับสู่ stackoverflow และขอขอบคุณสำหรับการตอบรับ แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่คุณสามารถพิจารณาเพิ่มคำอธิบายเกี่ยวกับปัญหาที่คุณแก้ไขได้หรือไม่และคุณจะแก้ไขได้อย่างไร สิ่งนี้จะช่วยให้ผู้อ่านในอนาคตเข้าใจคำตอบของคุณได้ดีขึ้นและเรียนรู้จากคำตอบนั้น
Plutian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.