Gấu trúc Thay thế NaN bằng chuỗi trống / trống


217

Tôi có một Dataframe như hình dưới đây:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

Tôi muốn xóa các giá trị NaN bằng một chuỗi rỗng để nó trông giống như vậy:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read

Câu trả lời:


260
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

Điều này có thể giúp. Nó sẽ thay thế tất cả NaN bằng một chuỗi rỗng.


1
thư viện nào np.nanđến từ đâu? Tôi không thể sử dụng nó
CaffeineConnoisseur

8
@CaffeineConnoisseur : import numpy as np.
John Zwinck

26
@CaffeineConnoisseur - hoặc chỉ pd.np.nankhi bạn không muốn import numpy.
elPastor

1
Điều này cũng cho phép Dict được lưu dưới dạng một chuỗi trong hàng .csv và sau đó đọc lại vào DataFrame bằng cách sử dụngpd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin

5
Cũng hữu ích để đề cập đến các ... inplace=Truetùy chọn.
smci

340
df = df.fillna('')

hoặc chỉ

df.fillna('', inplace=True)

Điều này sẽ lấp đầy na (ví dụ NaN) với ''.

Nếu bạn muốn điền vào một cột duy nhất, bạn có thể sử dụng:

df.column1 = df.column1.fillna('')

Người ta có thể sử dụng df['column1']thay vì df.column1.


5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor

99

Nếu bạn đang đọc khung dữ liệu từ một tệp (giả sử CSV hoặc Excel) thì hãy sử dụng:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

Điều này sẽ tự động coi các trường trống là các chuỗi trống ''


Nếu bạn đã có khung dữ liệu

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')

na_filter không khả dụng trên read_excel () pandas.pydata.org/pandas-docs/ sóng / trộm
Marjorie Roswell

tôi đã sử dụng nó trong ứng dụng của tôi. Nó tồn tại nhưng vì một số lý do, họ đã không đưa ra lập luận này trong các tài liệu. Nó hoạt động tốt cho tôi mặc dù không có lỗi.
Natesh

Nó hoạt động, tôi đang sử dụng nó trong phân tích cú phápxl.parse('sheet_name', na_filter=False)
Dmitrii

5

Sử dụng một trình định dạng, nếu bạn chỉ muốn định dạng nó để nó hiển thị độc đáo khi được in . Chỉ cần sử dụng df.to_string(... formattersđể xác định định dạng chuỗi tùy chỉnh mà không cần sửa đổi DataFrame của bạn hoặc lãng phí bộ nhớ:

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

Để có được:

   A B       C
0  a      read
1  b 1  unread
2  c      read

4
print df.fillna('')tự nó (không làm df = df.fillna('')) cũng không sửa đổi bản gốc. Có một tốc độ hoặc lợi thế khác để sử dụng to_string?
tưởng tượng

Đủ công bằng, df.fillna('')nó là!
Steve Schulist

@shadowtalker: Không nhất thiết, đó chỉ là câu trả lời đúng nếu OP muốn giữ df ở một định dạng (ví dụ hiệu quả hơn về mặt tính toán hoặc lưu bộ nhớ vào các chuỗi không cần thiết / trống / trùng lặp), nhưng hiển thị trực quan hơn cách làm hài lòng. Không biết thêm về trường hợp sử dụng, chúng tôi không thể nói chắc chắn.
smci

2

Thử cái này,

thêm vào inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)

1

sử dụng keep_default_na=False sẽ giúp bạn:

df = pd.read_csv(filename, keep_default_na=False)

0

Nếu bạn đang chuyển đổi DataFrame thành JSON, NaNsẽ báo lỗi vì vậy giải pháp tốt nhất trong trường hợp sử dụng này là thay thế NaNbằng None.
Đây là cách thực hiện:

df1 = df.where((pd.notnull(df)), None)

0

Tôi đã thử với một cột giá trị chuỗi bằng nan.

Để loại bỏ nan và điền vào chuỗi trống:

df.columnname.replace(np.nan,'',regex = True)

Để loại bỏ nan và điền vào một số giá trị:

df.columnname.replace(np.nan,'value',regex = True)

Tôi cũng đã thử df.iloc. nhưng nó cần chỉ số của cột. Vì vậy, bạn cần phải nhìn vào bảng một lần nữa. chỉ đơn giản là phương pháp trên giảm một bước.

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.