Cách đặt ô thành NaN trong khung dữ liệu gấu trúc


97

Tôi muốn thay thế các giá trị không hợp lệ trong một cột của khung dữ liệu bằng NaN's.

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

Tuy nhiên, dòng cuối cùng không thành công và đưa ra cảnh báo vì nó đang hoạt động trên một bản sao của df. Vì vậy, cách chính xác để xử lý điều này là gì? Tôi đã thấy nhiều giải pháp với iloc hoặc ix nhưng ở đây, tôi cần sử dụng điều kiện boolean.

Câu trả lời:


122

chỉ cần sử dụng replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

Những gì bạn đang thử được gọi là lập chỉ mục chuỗi: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Bạn có thể sử dụng locđể đảm bảo bạn hoạt động trên dF gốc:

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

13

Trong khi sử dụng replacedường như giải quyết được vấn đề, tôi muốn đề xuất một giải pháp thay thế. Vấn đề với kết hợp của số và một số giá trị chuỗi trong cột không phải để các chuỗi được thay thế bằng np.nan, nhưng để làm cho toàn bộ cột phù hợp. Tôi dám cá rằng cột ban đầu rất có thể thuộc loại đối tượng

Name: y, dtype: object

Những gì bạn thực sự cần là biến nó thành một cột số (nó sẽ có kiểu thích hợp và sẽ khá nhanh hơn), với tất cả các giá trị không phải số được thay thế bằng NaN.

Do đó, mã chuyển đổi tốt sẽ là

pd.to_numeric(df['y'], errors='coerce')

Chỉ định errors='coerce'để buộc các chuỗi không thể phân tích cú pháp thành giá trị số trở thành NaN. Loại cột sẽ là

Name: y, dtype: float64

10

Bạn có thể sử dụng thay thế:

df['y'] = df['y'].replace({'N/A': np.nan})

Cũng cần lưu ý về inplacetham số cho replace. Bạn có thể làm điều gì đó như:

df.replace({'N/A': np.nan}, inplace=True)

Điều này sẽ thay thế tất cả các trường hợp trong df mà không cần tạo bản sao.

Tương tự, nếu bạn gặp phải các loại giá trị không xác định khác, chẳng hạn như chuỗi trống hoặc giá trị Không:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

Tham khảo: Pandas Mới nhất - Thay thế


1
df.loc[df.y == 'N/A',['y']] = np.nan

Điều này giải quyết vấn đề của bạn. Với [] kép, bạn đang làm việc trên một bản sao của DataFrame. Bạn phải chỉ định vị trí chính xác trong một cuộc gọi để có thể sửa đổi nó.


0

Bạn có thể thử những đoạn này.

Trong [16]: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', ' 15 ',' Không / A ']}
Trong [17]: df = pd.DataFrame (mydata)

Trong [18]: df.y [df.y == "N / A"] = np.nan

Hết [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

0

Kể từ pandas 1.0.0, bạn không cần sử dụng numpy để tạo giá trị null trong khung dữ liệu của mình nữa. Thay vào đó, bạn chỉ có thể sử dụng pandas.NA (thuộc loại pandas._libs.missing.NAType), vì vậy nó sẽ được coi là null trong dataframe nhưng sẽ không là null bên ngoài dataframe context.

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.