2015-07-29 15 views
5

Trong khi df.fillna(0) điền tất cả các giá trị NA/NaN bằng 0, có chức năng thay thế tất cả các giá trị không -NA/NaN bằng giá trị khác không?Pandas đối diện với fillna (0)

Nếu các giá trị trong DataFrame của tôi là danh sách chiều dài thay đổi thì:

  • df.replace() đòi hỏi rằng các danh sách là cùng độ dài
  • chỉ số boolean như df[len(df) > 0] = 1 ném ValueError: cannot insert True, already exists
  • pandas.get_dummies() ném TypeError: unhashable type: 'list'

Có giải pháp đơn giản hơn không?

Trả lời

4

Bạn có thể sử dụng chỉ mục/phân với df[df.notnull()] = 1. Ví dụ:

>>> df = pd.DataFrame([[np.nan, 2, 5], [2, 5, np.nan], [2, 5, np.nan]]) 
>>> df # example frame 
    0 1 2 
0 NaN 2 5 
1 2 5 NaN 
2 2 5 NaN 

>>> df[df.notnull()] = 1 
>>> df 
    0 1 2 
0 NaN 1 1 
1 1 1 NaN 
2 1 1 NaN 
1

Tôi không biết của một hàm built-in, nhưng công trình này:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(data={'a':[np.nan, 13, 32]}) 

>> a 
    0 NaN 
    1 13 
    2 32 

df = df.applymap(lambda x: 1 if not np.isnan(x) else x) 

>>  a 
    0 NaN 
    1 1 
    2 1 
+0

Tôi đã sử dụng một cái gì đó như 'isinstance (x, list)' thay vì 'numpy.isnan (x)' để ngăn chặn việc nhận 'TypeError' nhưng sử dụng hàm lambda không giải quyết được vấn đề. – interpolack

Các vấn đề liên quan