รับ pandas.read_csv เพื่ออ่านค่าว่างเป็นสตริงว่างแทน nan


103

ฉันกำลังใช้ไลบรารีแพนด้าเพื่ออ่านข้อมูล CSV ในข้อมูลของฉันบางคอลัมน์มีสตริง สตริง"nan"เป็นค่าที่เป็นไปได้เช่นเดียวกับสตริงว่าง ฉันจัดการให้แพนด้าอ่าน "nan" เป็นสตริงได้ แต่ฉันคิดไม่ออกว่าจะทำอย่างไรให้มันไม่อ่านค่าว่างเป็น NaN นี่คือข้อมูลตัวอย่างและผลลัพธ์

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven

ได้อย่างถูกต้องอ่าน "น่าน" เป็นสตริง "น่าน' แต่ยังคงอ่านเซลล์ว่างเปล่าเป็นน่าน. ฉันพยายามผ่านstrในconvertersอาร์กิวเมนต์ read_csv (กับconverters={'One': str})) แต่ก็ยังอ่านเซลล์ว่างเปล่าเป็นน่าน

ฉันรู้ว่าฉันสามารถเติมค่าได้หลังจากอ่านด้วย Fillna แต่ไม่มีวิธีใดที่จะบอกแพนด้าได้จริง ๆ ว่าเซลล์ว่างในคอลัมน์ CSV หนึ่ง ๆ ควรอ่านเป็นสตริงว่างแทน NaN


สังเกตคำตอบที่ง่ายกว่าโดยใช้ตัวเลือกล่าสุด keep_default_naด้านล่าง
nealmcb

คำตอบ:


57

ฉันได้เพิ่มตั๋วเพื่อเพิ่มตัวเลือกบางประเภทที่นี่:

https://github.com/pydata/pandas/issues/1450

ระหว่างนี้result.fillna('')ควรทำในสิ่งที่คุณต้องการ

แก้ไข: ในเวอร์ชันพัฒนา (เป็น 0.8.0 ขั้นสุดท้าย) หากคุณระบุรายการna_valuesว่างสตริงว่างจะยังคงเป็นสตริงว่างในผลลัพธ์


12
เอกสารประกอบสำหรับDataFrame.fillna. ลองresult.fillna('', inplace=True). มิฉะนั้นจะสร้างสำเนาของ dataframe
Sergey Orshanskiy

1
ขอโทษที่รื้อฟื้นคำตอบเก่า ๆ แบบนี้ แต่เคยเกิดขึ้นจริงหรือ? เท่าที่ฉันสามารถบอกได้จากGitHub PRนี้มันถูกปิดโดยไม่เคยถูกรวมเข้าด้วยกันและฉันไม่เห็นพฤติกรรมที่ร้องขอในแพนด้าเวอร์ชั่น 0.14.x
ราม่า

10
ขณะนี้เอกสารสำหรับ read_csv มีทั้งna_values(list หรือ dict ที่จัดทำดัชนีโดยคอลัมน์) และkeep_default_na(bool) keep_default_naค่าบ่งชี้ว่าหมีแพนด้าค่า NA เริ่มต้นควรจะเปลี่ยนหรือต่อท้าย รหัสของ OP ใช้ไม่ได้ในขณะนี้เนื่องจากไม่มีการตั้งค่าสถานะนี้ pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False)ตัวอย่างนี้คุณสามารถใช้
Michael Delgado

ขอบคุณ @delgadom keep_default_naเพื่อนำฉันไป แต่โปรดทราบว่าเขาไม่ต้องการให้ 'nan' ถือเป็นค่าเริ่มต้นเช่นกัน ฉันได้เพิ่มคำอธิบายที่สมบูรณ์ยิ่งขึ้นเป็นคำตอบใหม่
nealmcb

1
เจอสิ่งนี้อีกครั้ง การแก้ไขนั้นง่ายมาก (คำตอบที่ดีที่สุดคือด้านล่างที่จะใส่keep_default_na=False) แต่พฤติกรรมเริ่มต้นของแพนด้าในเรื่องนี้คือ IMO ไม่ดี หากด้วยเหตุผลบางประการ pandas read_csv อนุมานว่าคอลัมน์ไม่ใช่ตัวเลขก็ไม่ควรเปลี่ยนสตริงว่างเป็น NaN โดยอัตโนมัติ
pietroppeter

117

ฉันยังคงสับสนหลังจากอ่านคำตอบและความคิดเห็นอื่น ๆ แต่คำตอบตอนนี้ดูเหมือนง่ายกว่าดังนั้นคุณไปเลย

ตั้งแต่ Pandas เวอร์ชัน 0.9 (จากปี 2012) คุณสามารถอ่าน csv ของคุณด้วยเซลล์ว่างที่ตีความว่าเป็นสตริงว่างโดยเพียงแค่ตั้งค่าkeep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False)

ปัญหานี้ได้รับการอธิบายอย่างชัดเจนยิ่งขึ้นใน

ที่ได้รับการแก้ไขเมื่อวันที่ 19 สิงหาคม 2555 สำหรับ Pandas เวอร์ชัน 0.9 นิ้ว


6
นี่เป็นคำตอบที่ดีที่สุดอย่างชัดเจนควรกำหนดให้เป็นทางออกแรก ขอบคุณ @nealmcb
dzof31

3
เหตุใดจึงไม่เป็นคำตอบยอดนิยม หาวิธีแก้ปัญหานี้ตั้งแต่เมื่อวาน ขอบคุณ!
anish

8

เรามีอาร์กิวเมนต์ง่ายๆใน Pandas read_csv สำหรับสิ่งนี้:

ใช้:

df = pd.read_csv('test.csv', na_filter= False)

เอกสาร Pandas อธิบายอย่างชัดเจนว่าอาร์กิวเมนต์ข้างต้นทำงานอย่างไร

ลิงค์


ดูเหมือนว่า OP จะต้องการใช้na_valuesเพื่อจดจำ "น่าน" แต่การna_filterปิดทั้งหมดจะเป็นการเอาชนะสิ่งนั้น ดังนั้นคำตอบของฉันกับkeep_default_na=False.
nealmcb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.