Thay thế None bằng NaN trong khung dữ liệu gấu trúc


99

Tôi có bảng x:

        website
0   http://www.google.com/
1   http://www.yahoo.com
2   None

Tôi muốn thay thế python Không bằng gấu trúc NaN. Tôi đã thử:

x.replace(to_replace=None, value=np.nan)

Nhưng tôi nhận được:

TypeError: 'regex' must be a string or a compiled regular expression or a list or dict of strings or regular expressions, you passed a 'bool'

Làm thế nào tôi nên đi về nó?

Câu trả lời:


145

Bạn có thể sử dụng DataFrame.fillnahoặc Series.fillnasẽ thay thế đối tượng Python None, không phải chuỗi 'None'.

import pandas as pd
import numpy as np

Đối với khung dữ liệu:

df = df.fillna(value=np.nan)

Đối với cột hoặc chuỗi:

df.mycol.fillna(value=np.nan, inplace=True)

3
Nếu bạn đã nhập dữ liệu từ cơ sở dữ liệu SQL, bạn có thể kết hợp điều này với câu trả lời bên dưới. Điều này chuyển đổi Không (không phải là một chuỗi) thành NaN. Sau đó, bạn có thể df['column'].replace(nan, "", inplace=True)nếu nói rằng bạn muốn Không có là chuỗi trống.
VISQL

1
Câu trả lời này không làm việc cho tôi; nó không thay thế None. Câu trả lời của Max hoạt động.
Daniel

Tôi tìm thấy giải pháp này cột cụ thể là hiệu quả nhất: df['website'].replace(pd.np.nan, 0, inplace=True). Nó cũng không yêu cầu Numpy phải được đưa vào, dựa vào tham chiếu có sẵn của Pandas.
CodeMantle

2
pd.np.nanbây giờ cho FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead.
Alex Povel

16

Đây là một tùy chọn khác:

df.replace(to_replace=[None], value=np.nan, inplace=True)

3
Hãy cẩn thận khi bạn chạy df.replace ([None], np.nan, inplace = True), điều này đã thay đổi tất cả các đối tượng datetime có dữ liệu bị thiếu thành loại đối tượng. Vì vậy, bây giờ bạn có thể có các truy vấn bị hỏng trừ khi bạn thay đổi chúng trở lại ngày giờ, điều này có thể bị đánh thuế tùy thuộc vào kích thước dữ liệu của bạn.
Doubledown

15

Dòng sau thay thế Nonebằng NaN:

df['column'].replace('None', np.nan, inplace=True)

Chỉ cần kiểm tra kỹ nó, nó hoạt động với tôi. Bạn có gặp bất kỳ lỗi nào không hoặc giá trị 'Không có' không được thay thế?
Max Izadi

NB: phương thức này sử dụng np.nan, có kiểu float (ví dụ float64:), trái ngược với kiểu mặc định của pandas objectcho cột nan.
tehfink

6
Lưu ý: Điều này thay thế các chuỗi bằng văn bản "Không có", nhưng không thay thế các giá trị Không rõ ràng ( Không có như trong hằng số ).
Gregor Müllegger

4

Nếu bạn sử dụng df.replace ([None], np.nan, inplace = True), điều này đã thay đổi tất cả các đối tượng datetime có dữ liệu bị thiếu thành loại đối tượng. Vì vậy, bây giờ bạn có thể có các truy vấn bị hỏng trừ khi bạn thay đổi chúng về ngày giờ, điều này có thể bị đánh thuế tùy thuộc vào kích thước dữ liệu của bạn.

Nếu bạn muốn sử dụng phương pháp này, trước tiên bạn có thể xác định các trường dtype đối tượng trong df của bạn và sau đó thay thế None:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)

0
DataFrame['Col_name'].replace("None", np.nan, inplace=True)

1
Xin chào và chào mừng bạn đến với stackoverflow và cảm ơn bạn đã trả lời. Mặc dù mã này có thể trả lời câu hỏi, bạn có thể xem xét thêm một số lời giải thích cho vấn đề bạn đã giải quyết và cách bạn giải quyết nó? Điều này sẽ giúp những người đọc trong tương lai hiểu rõ hơn câu trả lời của bạn và rút kinh nghiệm.
Plutian
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.