Pandas แทนที่ NaN ด้วยสตริงว่าง / ว่าง


218

ฉันมี Pandas Dataframe ตามที่แสดงด้านล่าง:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

ฉันต้องการลบค่า NaN ด้วยสตริงว่างเพื่อให้ดูเหมือน:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read

คำตอบ:


261
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

สิ่งนี้อาจช่วยได้ มันจะแทนที่ NaNs ทั้งหมดด้วยสตริงว่าง


1
ห้องสมุดnp.nanมาจากไหน ฉันใช้มันไม่ได้หรอก
CaffeineConnoisseur

8
import numpy as np@CaffeineConnoisseur:
John Zwinck

26
@CaffeineConnoisseur - หรือเพียงแค่pd.np.nanถ้าคุณไม่ต้องการimport numpyเช่นกัน
elPastor

1
สิ่งนี้ยังอนุญาตให้ Dict ถูกบันทึกเป็นสตริงในแถวของ. csv และจากนั้นอ่านกลับเข้าไปใน DataFrame โดยใช้pd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin

5
ยังมีประโยชน์ในการพูดถึง... inplace=Trueตัวเลือก
smci

342
df = df.fillna('')

หรือเพียงแค่

df.fillna('', inplace=True)

นี้จะเติม na (เช่นน่าน) ''กับ

หากคุณต้องการเติมคอลัมน์เดียวคุณสามารถใช้:

df.column1 = df.column1.fillna('')

หนึ่งสามารถใช้แทนdf['column1']df.column1


5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor

99

หากคุณกำลังอ่านชื่อไฟล์จากไฟล์ (พูด CSV หรือ Excel) ให้ใช้:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

การทำเช่นนี้จะถือว่าฟิลด์ว่างเป็นสตริงว่างโดยอัตโนมัติ ''


หากคุณมีชื่อไฟล์อยู่แล้ว

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')

na_filter ไม่สามารถใช้งานได้ใน read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell

ฉันได้ใช้มันในแอปพลิเคชันของฉัน มีอยู่ แต่ด้วยเหตุผลบางอย่างพวกเขาไม่ได้ให้เหตุผลนี้ในเอกสาร มันใช้งานได้ดีสำหรับฉันแม้ว่าไม่มีข้อผิดพลาด
Natesh bhat

มันใช้งานได้ฉันใช้มันในการแยกวิเคราะห์xl.parse('sheet_name', na_filter=False)
Dmitrii

5

ใช้การจัดรูปแบบถ้าคุณเพียงต้องการจัดรูปแบบเพื่อที่จะแสดงผลเป็นอย่างดีเมื่อพิมพ์ เพียงใช้ปุ่มdf.to_string(... formattersเพื่อกำหนดรูปแบบสตริงแบบกำหนดเองโดยไม่ต้องแก้ไข DataFrame หรือหน่วยความจำที่สูญเปล่าโดยไม่จำเป็น:

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

ที่จะได้รับ:

   A B       C
0  a      read
1  b 1  unread
2  c      read

4
print df.fillna('')ด้วยตัวเอง (โดยไม่ทำdf = df.fillna('')) ไม่ได้แก้ไขต้นฉบับเช่นกัน มีความเร็วหรือข้อดีอื่น ๆ ในการใช้to_stringหรือไม่?
เพ้อฝัน

ยุติธรรมพอdf.fillna('')มันเป็น!
Steve Schulist

@shadowtalker: ไม่จำเป็นจะเป็นเพียงคำตอบที่ถูกต้องหาก OP ต้องการเก็บ df ในรูปแบบเดียว (เช่นมีประสิทธิภาพมากกว่าการคำนวณหรือบันทึกหน่วยความจำในสตริงที่ไม่จำเป็น / ว่าง / ซ้ำ) แต่ทำให้มองเห็นได้ในอีก วิธีที่ถูกใจ เราไม่สามารถพูดได้อย่างแน่นอน
smci



0

หากคุณมีการแปลง DataFrame เพื่อ JSON, NaNจะให้ข้อผิดพลาดเพื่อแก้ปัญหาที่ดีที่สุดคือการใช้ในกรณีนี้คือการแทนที่ด้วยNaN นี่คือวิธี: None

df1 = df.where((pd.notnull(df)), None)

0

ฉันลองกับหนึ่งคอลัมน์ของค่าสตริงกับน่าน

หากต้องการลบนาโนและเติมสตริงว่าง:

df.columnname.replace(np.nan,'',regex = True)

หากต้องการลบนาโนและเติมค่าบางค่า:

df.columnname.replace(np.nan,'value',regex = True)

ฉันลอง df.iloc ด้วย แต่มันต้องการดัชนีของคอลัมน์ ดังนั้นคุณต้องมองเข้าไปในตารางอีกครั้ง เพียงวิธีข้างต้นลดขั้นตอนเดียว

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