ฉันจะลบน่านออกจากรายการ Python / NumPy ได้อย่างไร


96

ฉันมีรายการที่นับค่าหนึ่งในค่าที่ฉันได้คือ 'nan'

countries= [nan, 'USA', 'UK', 'France']

ฉันพยายามลบออก แต่ทุกครั้งก็ได้รับข้อผิดพลาด

cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required

เมื่อฉันลองสิ่งนี้:

cleanedList = cities[np.logical_not(np.isnan(countries))]
cleanedList = cities[~np.isnan(countries)]

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

4
ดูเหมือนว่าสตริง"nan"ไม่ใช่ค่า NaN จริง
BrenBarn

1
ใช่มันคือสตริง [x สำหรับ x ในประเทศถ้า x! = 'nan']
MarshalSHI

4
if condition == Trueไม่จำเป็นคุณก็ทำได้if conditionเสมอ
reem

ยังไม่มีวิธีแก้ปัญหาใดที่ไม่น่าพอใจ ผมมีปัญหาเดียวกัน. โดยทั่วไปจะใช้ไม่ได้กับสตริง ดังนั้นในกรณีของคุณnp.isnan('USA')จะส่งข้อความแสดงข้อผิดพลาดเดียวกัน หากฉันพบวิธีแก้ปัญหาฉันจะอัปโหลด
Yohan Obadia

คำตอบ:


131

คำถามมีการเปลี่ยนแปลงเพื่อให้มีคำตอบ:

ไม่สามารถทดสอบสตริงโดยใช้math.isnanเนื่องจากคาดว่าจะมีอาร์กิวเมนต์ลอย ในcountriesรายการของคุณคุณมีลอยและสตริง

ในกรณีของคุณสิ่งต่อไปนี้ควรเพียงพอ:

cleanedList = [x for x in countries if str(x) != 'nan']

คำตอบเก่า

ในcountriesรายการของคุณลิเทอรัล'nan'เป็นสตริงไม่ใช่ Python float nanซึ่งเทียบเท่ากับ:

float('NaN')

ในกรณีของคุณสิ่งต่อไปนี้ควรเพียงพอ:

cleanedList = [x for x in countries if x != 'nan']

1
เหตุผลที่คุณพูดเป็นความจริง แต่มันไม่ได้ผลกับฉัน
user3001937

จากนั้นปัญหาอยู่ในพื้นที่อื่นอาร์เรย์ที่คุณให้คือสตริงซึ่งmath.isnanจะเป็นธรรมชาติผ่านข้อผิดพลาดด้วย

ครับ! เมื่อฉันพิมพ์ผลลัพธ์ฉันได้รับสิ่งนี้: [nan, 'USA', 'UK', 'France']
user3001937

1
@ user3001937 ฉันได้อัปเดตคำตอบตามข้อมูลใหม่แล้ว

2
zhangxaochen: ไม่ใช่สตริง แต่เป็นลอย ดูคำตอบที่อัปเดตอย่างรอบคอบ Lego Stormtroopr กำลังแปลงxเป็นสตริงเพื่อให้คุณสามารถเปรียบเทียบได้ nanจะคืนค่าเท็จเสมอสำหรับ==แม้ว่าจะเปรียบเทียบnanด้วยก็ตามนั่นเป็นวิธีที่ง่ายที่สุดในการเปรียบเทียบ
ฟรี Monica Cellio

17

ปัญหามาจากข้อเท็จจริงที่np.isnan()ไม่สามารถจัดการกับค่าสตริงได้อย่างถูกต้อง ตัวอย่างเช่นหากคุณทำ:

np.isnan("A")
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

อย่างไรก็ตามเวอร์ชันของแพนด้าpd.isnull()ใช้ได้กับค่าตัวเลขและสตริง:

pd.isnull("A")
> False

pd.isnull(3)
> False

pd.isnull(np.nan)
> True

pd.isnull(None)
> True

15

โดยใช้ตัวอย่างของคุณโดยที่ ...

countries= [nan, 'USA', 'UK', 'France']

เนื่องจาก nan ไม่เท่ากับ nan (nan! = nan) และประเทศ [0] = nan จึงควรปฏิบัติดังนี้

countries[0] == countries[0]
False

อย่างไรก็ตาม

countries[1] == countries[1]
True
countries[2] == countries[2]
True
countries[3] == countries[3]
True

ดังนั้นสิ่งต่อไปนี้ควรใช้งานได้:

cleanedList = [x for x in countries if x == x]

1
นี่เป็นคำตอบเดียวที่ใช้ได้ผลเมื่อคุณมี float ('nan') ในรายการสตริง
kmundnic

13
import numpy as np

mylist = [3, 4, 5, np.nan]
l = [x for x in mylist if ~np.isnan(x)]

สิ่งนี้ควรลบ NaN ทั้งหมด แน่นอนฉันคิดว่ามันไม่ใช่สตริงที่นี่ แต่เป็น NaN ( np.nan) จริง


1
สิ่งนี้ทำให้ฉันมีข้อผิดพลาด: TypeError: ufunc 'isnan' ไม่รองรับประเภทอินพุตและอินพุตไม่สามารถบังคับได้อย่างปลอดภัยกับประเภทที่รองรับตามกฎการคัดเลือก '' ปลอดภัย ''
Zak Keirn

1
ทำไมไม่เพียง: x[~ np.isnan(x)]? ไม่จำเป็นต้องมีความเข้าใจในรายการเป็นตัวเลข แน่นอนฉันถือว่า x เป็นอาร์เรย์จำนวนนับ
Bue

ฉันคิดว่า x จะไม่เป็นอาร์เรย์ตัวเลขตามที่คำถามแนะนำ
Ajay Shah

มันจะคาดหวังลอย จะไม่ทำงานในรายการที่มีสตริง @ZakKeirn
Shirish Bajpai


6

หากคุณตรวจสอบประเภทองค์ประกอบ

type(countries[1])

ผลลัพธ์จะเป็น<class float> เพื่อให้คุณสามารถใช้รหัสต่อไปนี้:

[i for i in countries if type(i) is not float]



1

ในตัวอย่างของคุณ'nan'คือสตริงแทนที่จะใช้isnan()เพียงแค่ตรวจสอบสตริง

แบบนี้:

cleanedList = [x for x in countries if x != 'nan']

-1

ฉันสังเกตว่าตัวอย่างเช่น Pandas จะคืนค่า 'nan' สำหรับค่าว่าง เนื่องจากไม่ใช่สตริงคุณจึงต้องแปลงเป็นสตริงเพื่อให้จับคู่ได้ ตัวอย่างเช่น:

ulist = df.column1.unique() #create a list from a column with Pandas which 
for loc in ulist:
    loc = str(loc)   #here 'nan' is converted to a string to compare with if
    if loc != 'nan':
        print(loc)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.