Gấu trúc Python Lọc nan từ lựa chọn dữ liệu của một chuỗi các chuỗi


190

Không sử dụng groupbylàm thế nào tôi có thể lọc ra dữ liệu mà không có NaN?

Giả sử tôi có một ma trận nơi khách hàng sẽ điền vào 'N / A', 'n / a' hoặc bất kỳ biến thể nào của nó và các biến thể khác để trống:

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [3., 4., 5., np.nan, np.nan, np.nan],
                  'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})

nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]

đầu ra:

>>> nms
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

Làm cách nào để lọc các giá trị NaN để tôi có thể có kết quả hoạt động như thế này:

  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

Tôi đoán tôi cần một cái gì đó giống như ~np.isnannhưng tilda không hoạt động với chuỗi.

Câu trả lời:


254

Chỉ cần thả chúng:

nms.dropna(thresh=2)

điều này sẽ thả tất cả các hàng có ít nhất hai hàng không NaN.

Sau đó, bạn có thể thả tên là NaN:

In [87]:

nms
Out[87]:
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

[5 rows x 3 columns]
In [89]:

nms = nms.dropna(thresh=2)
In [90]:

nms[nms.name.notnull()]
Out[90]:
  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

[2 rows x 3 columns]

BIÊN TẬP

Trên thực tế, nhìn vào những gì bạn muốn ban đầu, bạn có thể làm điều này mà không cần dropnacuộc gọi:

nms[nms.name.notnull()]

CẬP NHẬT

Nhìn vào câu hỏi này 3 năm sau, có một sai lầm, trước tiên, thresharg tìm kiếm ít nhất là ncác NaNgiá trị không phải vì vậy trên thực tế, đầu ra phải là:

In [4]:
nms.dropna(thresh=2)

Out[4]:
  movie    name  rating
0   thg    John     3.0
1   thg     NaN     4.0
3   mol  Graham     NaN

Có thể là tôi đã nhầm 3 năm trước hoặc phiên bản gấu trúc tôi đang chạy có lỗi, cả hai kịch bản đều hoàn toàn có thể.


190

Đơn giản nhất trong tất cả các giải pháp:

filtered_df = df[df['name'].notnull()]

Do đó, nó chỉ lọc ra các hàng không có giá trị NaN trong cột 'name'.

Đối với nhiều cột:

filtered_df = df[df[['name', 'country', 'region']].notnull().all(1)]

2
Làm thế nào để bạn đạt được điều này với nhiều cột, ORing chúng cùng nhau. 'tên' là null hoặc 'foo' là null
Greg Hilston

3
@Greg Hilston Sử dụng & hoặc | opearator để điều kiện chuỗi trong khi lọc. filtered_df = df[df['name'].notnull() | df['foo'].notnull()]
Deepak Rajendran

2
@GregHilston Tôi cũng đã thêm câu trả lời cho câu hỏi của bạn, trong ví dụ này tôi đang lọc các giá trị không null của cols như cols = ['name', 'area', 'country']
Gil Baggio

9
df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})

for col in df.columns:
    df = df[~pd.isnull(df[col])]

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.