Ігнорування NaN з str.contains


117

Я хочу знайти рядки, які містять рядок, як-от так:

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

Однак це не вдається, оскільки деякі елементи є NaN:

ValueError: не вдається індексувати вектор, що містить значення NA / NaN

Тож я вдаюсь до затуманених

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

Чи є кращий спосіб?

Відповіді:


226

Для цього є прапор:

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

Дивіться str.replaceдокументи:

na: NaN за замовчуванням, значення заповнення для відсутніх значень.


Тож ви можете зробити наступне:

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

2
Тут у мене була ситуація, коли aбуло заповнено з CSV, і aстовпець містив рядок "nan". pandas"розумно" перетворив це NaNі почав скаржитися, коли я намагався це зробити df.a.str.contains(). Тож так, проти: переконайтеся, що потрібно встановити тип стовпця в read_csv()або після цього, зробіть щось на кшталт df = df.where(pandas.notnull(df), "nan")LOL
dmn

Чому df.locі не просто df?
PascalVKooten

@PascalVKooten або добре, або ж .loc, оскільки imo це трохи явніше.
Енді Хайден

1
Я врятував мене ... якби цього тут не було, я думаю, я пережив би кошмар два тижні, стукаючи головою в стіну :-), безумовно, варто +1,
U10-Вперед

5
Lol, чому це не за замовчуванням?
ifly6

8

На додаток до вищезазначених відповідей, я б сказав, що для стовпців, що не мають жодної назви слова, ви можете використовувати: -

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

Сподіваюся, це допомагає.


0

Я не на 100% на те, чому (насправді прийшов сюди шукати відповідь), але це також працює, і не вимагає заміни всіх нан-значень.

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]

Працює з або без .loc.

Я не маю поняття, чому це працює, як я розумію, коли ви індексуєте дужками, панди оцінює все, що є у дужці, як Trueабо False. Я не можу сказати, чому введення фрази в дужках "додаткових бульних" взагалі має будь-який ефект.



-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]

Це не відповідь.
ifly6
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.