Cách tìm cột nào chứa bất kỳ giá trị NaN nào trong khung dữ liệu Pandas


144

Đưa ra một khung dữ liệu gấu trúc chứa các giá trị NaN có thể nằm rải rác ở đây và đó:

Câu hỏi: Làm cách nào để xác định cột nào chứa giá trị NaN? Cụ thể, tôi có thể nhận danh sách các tên cột chứa NaN không?


5
df.isna().any()[lambda x: x]làm việc cho tôi
matanster

Câu trả lời:


249

CẬP NHẬT: sử dụng Pandas 0.22.0

Các phiên bản Pandas mới hơn có các phương thức mới '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

như danh sách các cột:

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

để chọn các cột đó (chứa ít nhất một NaNgiá trị):

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

Câu trả lời của OLD:

Hãy thử sử dụng 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

hoặc như @root đề xuất phiên bản rõ ràng hơn:

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']

để chọn một tập hợp con - tất cả các cột chứa ít nhất một NaNgiá trị:

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

Cảm ơn vì sự trả lời! Tôi đang tìm kiếm một danh sách các tên cột (tôi đã cập nhật câu hỏi của mình cho phù hợp), bạn có biết làm thế nào không?
denvar

Bạn có biết một cách tốt để chọn tất cả các cột có giá trị cụ thể thay vì giá trị null không?
gregorio099

1
Đừng bận tâm! Chỉ cần thay thế .isnull () bằng .isin (['xxx']) để tìm kiếm các giá trị thay vì null:df.columns[df.isin['xxx'].any()].tolist()
gregorio099

@ gregorio099, tôi sẽ làm theo cách này:df.columns[df.eq(search_for_value).any()].tolist()
MaxU

1
Câu trả lời tốt đẹp, đã được nâng cao. Ý tưởng - bạn có thể thêm chức năng mới isna, notna ?
jezrael

26

Bạn có thể sử dụng df.isnull().sum(). Nó hiển thị tất cả các cột và tổng NaN của từng tính năng.


8

Tôi gặp vấn đề khi phải kiểm tra trực quan trên màn hình để có một danh sách ngắn comp lọc và trả về các cột vi phạm

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

nếu điều đó hữu ích cho bất cứ ai


4

Trong các bộ dữ liệu có số lượng cột lớn thậm chí còn tốt hơn để xem có bao nhiêu cột chứa giá trị null và bao nhiêu cột không.

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))

Ví dụ: trong khung dữ liệu của tôi, nó chứa 82 cột, trong đó 19 cột chứa ít nhất một giá trị null.

Hơn nữa, bạn cũng có thể tự động xóa cols và hàng tùy theo đó có nhiều giá trị null hơn
Đây là mã thực hiện điều này một cách thông minh:

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

Lưu ý: Mã trên loại bỏ tất cả các giá trị null của bạn. Nếu bạn muốn giá trị null, xử lý chúng trước.


2

tôi sử dụng ba dòng mã này để in ra các tên cột chứa ít nhất một giá trị null:

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

2

Cả hai nên hoạt động:

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

Các phương thức DataFrame isna()hoặc isnull()hoàn toàn giống nhau.

Lưu ý : Chuỗi rỗng ''được coi là Sai (không được coi là NA)


1

Điều này làm việc cho tôi,

1. Để nhận Cột có ít nhất 1 giá trị null. (tên cột)

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

2. Để nhận Cột có số đếm, có ít nhất 1 giá trị null.

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

[Tùy chọn] 3. Để có được tỷ lệ phần trăm của số null.

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

Cảm ơn vì nhiều cách tiếp cận!
Mike Rapadas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.