วิธีค้นหาว่าคอลัมน์ใดมีค่า NaN ใน Pandas dataframe


160

กำหนดดาต้าเฟรมของแพนด้าที่มีค่า NaN ที่เป็นไปได้ซึ่งกระจัดกระจายอยู่ที่นี่และที่นั่น:

คำถาม:ฉันจะทราบได้อย่างไรว่าคอลัมน์ใดมีค่า NaN โดยเฉพาะอย่างยิ่งฉันจะได้รับรายชื่อคอลัมน์ที่มี NaNs หรือไม่


6
df.isna().any()[lambda x: x]ทำงานให้ฉัน
matanster

คำตอบ:


269

อัปเดต:โดยใช้ Pandas 0.22.0

Pandas เวอร์ชันที่ใหม่กว่ามีเมธอดใหม่'DataFrame.isna ()'และ'DataFrame.notna ()'

In [71]: df
Out[71]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [72]: df.isna().any()
Out[72]:
a     True
b     True
c    False
dtype: bool

เป็นรายการคอลัมน์:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

เพื่อเลือกคอลัมน์เหล่านั้น (มีอย่างน้อยหนึ่งNaNค่า):

In [73]: df.loc[:, df.isna().any()]
Out[73]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

คำตอบเก่า:

พยายามใช้isnull () :

In [97]: df
Out[97]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [98]: pd.isnull(df).sum() > 0
Out[98]:
a     True
b     True
c    False
dtype: bool

หรือเป็น @root เสนอเวอร์ชันที่ชัดเจนกว่า:

In [5]: df.isnull().any()
Out[5]:
a     True
b     True
c    False
dtype: bool

In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']

เพื่อเลือกชุดย่อย - คอลัมน์ทั้งหมดที่มีอย่างน้อยหนึ่งNaNค่า:

In [31]: df.loc[:, df.isnull().any()]
Out[31]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

ขอบคุณสำหรับการตอบกลับ! ฉันต้องการรายชื่อคอลัมน์ (ฉันอัปเดตคำถามตามนั้น) คุณรู้หรือไม่?
denvar

คุณรู้วิธีที่ดีในการเลือกคอลัมน์ทั้งหมดที่มีค่าเฉพาะแทนค่า null หรือไม่?
gregorio099

1
ไม่เป็นไร! เพียงแทนที่. isnull () ด้วย. isin (['xxx']) เพื่อค้นหาค่าแทนค่าว่าง:df.columns[df.isin['xxx'].any()].tolist()
gregorio099

@ gregorio099 ฉันจะทำแบบนี้:df.columns[df.eq(search_for_value).any()].tolist()
MaxU

1
คำตอบที่ดีโหวตแล้ว Idea - คุณสามารถเพิ่มฟังก์ชันใหม่isnaได้notna ไหม
jezrael

27

คุณสามารถใช้df.isnull().sum(). จะแสดงคอลัมน์ทั้งหมดและ NaN ทั้งหมดของแต่ละคุณลักษณะ


11

ฉันมีปัญหาที่ฉันต้องใช้หลายคอลัมน์เพื่อตรวจสอบด้วยสายตาบนหน้าจอดังนั้นรายการคอมพ์สั้น ๆ ที่กรองและส่งคืนคอลัมน์ที่กระทำผิดคือ

nan_cols = [i for i in df.columns if df[i].isnull().any()]

หากสิ่งนั้นเป็นประโยชน์กับทุกคน


4

ในชุดข้อมูลที่มีคอลัมน์จำนวนมากควรดูว่ามีคอลัมน์จำนวนเท่าใดที่มีค่า null และจำนวนคอลัมน์ที่ไม่มี

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

ตัวอย่างเช่นในดาต้าเฟรมของฉันมี 82 คอลัมน์ซึ่ง 19 มีค่าว่างอย่างน้อยหนึ่งค่า

นอกจากนี้คุณยังสามารถลบคอลัมน์และแถวโดยอัตโนมัติขึ้นอยู่กับว่าค่าใดมีค่าว่างมากกว่า
นี่คือรหัสที่ทำสิ่งนี้อย่างชาญฉลาด:

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

หมายเหตุ:โค้ดด้านบนจะลบค่าว่างทั้งหมดของคุณ หากคุณต้องการค่า null ให้ประมวลผลก่อน


2

ฉันใช้รหัสสามบรรทัดนี้เพื่อพิมพ์ชื่อคอลัมน์ซึ่งมีค่า null อย่างน้อยหนึ่งค่า:

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))

2

ทั้งสองอย่างนี้ควรใช้งานได้:

df.isnull().sum()
df.isna().sum()

เมธอด DataFrame isna()หรือisnull()เหมือนกันทั้งหมด

หมายเหตุ : สตริงว่าง''ถือเป็น False (ไม่ถือว่าเป็น NA)


2

สิ่งนี้ได้ผลสำหรับฉัน

1. เพื่อให้คอลัมน์มีค่า null อย่างน้อย 1 ค่า (ชื่อคอลัมน์)

data.columns[data.isnull().any()]

2. สำหรับการรับ Columns พร้อม count โดยมีค่า null อย่างน้อย 1 ค่า

data[data.columns[data.isnull().any()]].isnull().sum()

[ไม่บังคับ] 3. สำหรับการรับเปอร์เซ็นต์ของการนับ null

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]

ขอบคุณสำหรับแนวทางที่หลากหลาย!
Mike Rapadas

-1

สร้างแผนที่บูลีน (ต้องเป็นอาร์เรย์จาก numpy เพื่อให้คุณสามารถส่งผ่านแอตทริบิวต์ค่า)

df[df.isna().values]

และนั่นคือทั้งหมด


ส่งคืนรายการคอลัมน์อย่างไร df.isna().valuesส่งคืนเมทริกซ์ด้วยTrueที่ i, j iff df.iloc[i, j]คือ NaN จากนั้นคุณใช้การสร้างดัชนีบูลีนกับเมทริกซ์ซึ่งแพนด้าเรียกdf.isna().values.nonzero()ใช้ภายในและรับองค์ประกอบแรกของผลลัพธ์ โดยพื้นฐานแล้วคุณกำลังส่งคืนแถวทั้งหมดที่มี NaN
Boyan Hristov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.