Bỏ qua NaN với str.contains


117

Tôi muốn tìm các hàng có chứa một chuỗi, như sau:

DF[DF.col.str.contains("foo")]

Tuy nhiên, điều này không thành công vì một số phần tử là NaN:

ValueError: không thể lập chỉ mục với vectơ chứa giá trị NA / NaN

Vì vậy, tôi sử dụng

DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]

Có cách nào tốt hơn?

Câu trả lời:


226

Có một lá cờ cho điều đó:

In [11]: df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

In [12]: df.a.str.contains("foo")
Out[12]:
0     True
1     True
2    False
3      NaN
Name: a, dtype: object

In [13]: df.a.str.contains("foo", na=False)
Out[13]:
0     True
1     True
2    False
3    False
Name: a, dtype: bool

Xem str.replacetài liệu:

na: NaN mặc định, điền giá trị cho các giá trị còn thiếu.


Vì vậy, bạn có thể làm như sau:

In [21]: df.loc[df.a.str.contains("foo", na=False)]
Out[21]:
      a
0  foo1
1  foo2

2
Ở đây, tôi đã gặp trường hợp ađược điền từ một CSV và acột chứa chuỗi "nan". pandas"một cách thông minh" đã chuyển đổi điều này thành NaNvà bắt đầu phàn nàn khi tôi cố gắng làm df.a.str.contains(). Vì vậy, yeah protip: Hãy chắc chắn để thiết lập các loại cột trong read_csv()hoặc sau đó làm một cái gì đó giống như df = df.where(pandas.notnull(df), "nan")LOL
DMN

Tại sao df.locvà không chỉ df?
PascalVKooten

@PascalVKooten cũng được, tôi thích .loc vì imo nó rõ ràng hơn một chút.
Andy Hayden

1
Ya đã cứu tôi ... nếu điều này không có ở đây, tôi nghĩ tôi sẽ trải qua cơn ác mộng kéo dài hai tuần đập đầu vào tường :-) chắc chắn đáng được +1, lol
U10-Forward

5
Lol tại sao điều này không phải là mặc định?
ifly6

8

Ngoài các câu trả lời ở trên, tôi muốn nói rằng đối với các cột không có tên từ đơn lẻ, bạn có thể sử dụng: -

df[df['Product ID'].str.contains("foo") == True]

Hi vọng điêu nay co ich.


0

Tôi không hiểu 100% lý do tại sao (thực sự đến đây để tìm kiếm câu trả lời), nhưng điều này cũng hoạt động và không yêu cầu thay thế tất cả các giá trị nan.

import pandas as pd
import numpy as np

df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

newdf = df.loc[df['a'].str.contains('foo') == True]

Hoạt động có hoặc không .loc.

Tôi không biết tại sao điều này hoạt động, vì tôi hiểu nó khi bạn lập chỉ mục với dấu ngoặc, gấu trúc đánh giá bất kỳ thứ gì bên trong dấu ngoặc là Truehoặc False. Tôi không thể biết tại sao việc tạo cụm từ bên trong dấu ngoặc 'thêm boolean' lại có tác dụng gì.



-3
import folium
import pandas

data= pandas.read_csv("maps.txt")

lat = list(data["latitude"])
lon = list(data["longitude"])

map= folium.Map(location=[31.5204, 74.3587], zoom_start=6, tiles="Mapbox Bright")

fg = folium.FeatureGroup(name="My Map")

for lt, ln in zip(lat, lon):
c1 = fg.add_child(folium.Marker(location=[lt, ln], popup="Hi i am a Country",icon=folium.Icon(color='green')))

child = fg.add_child(folium.Marker(location=[31.5204, 74.5387], popup="Welcome to Lahore", icon= folium.Icon(color='green')))

map.add_child(fg)

map.save("Lahore.html")


Traceback (most recent call last):
  File "C:\Users\Ryan\AppData\Local\Programs\Python\Python36-32\check2.py", line 14, in <module>
    c1 = fg.add_child(folium.Marker(location=[lt, ln], popup="Hi i am a Country",icon=folium.Icon(color='green')))
  File "C:\Users\Ryan\AppData\Local\Programs\Python\Python36-32\lib\site-packages\folium\map.py", line 647, in __init__
    self.location = _validate_coordinates(location)
  File "C:\Users\Ryan\AppData\Local\Programs\Python\Python36-32\lib\site-packages\folium\utilities.py", line 48, in _validate_coordinates
    'got:\n{!r}'.format(coordinates))
ValueError: Location values cannot contain NaNs, got:
[nan, nan]

Đây không phải là một câu trả lời.
ifly6
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.