str.contains로 NaN 무시


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(). 그래서 예 protip : 열 유형을 설정 read_csv()하거나 나중에 df = df.where(pandas.notnull(df), "nan")LOL 과 같은 것을하십시오
dmn

df.loc뿐만 아니라 df?
PascalVKooten

@PascalVKooten도 괜찮습니다, ilike .loc imo이므로 좀 더 명시 적입니다.
Andy Hayden

1
Ya save me ... 이것이 여기에 없었다면, 2 주 동안 벽에 머리를 부딪히는 악몽을 겪었을 것 같아요 :-) 확실히 +1 가치가 있습니다, lol
U10-Forward

5
Lol이 기본값이 아닌 이유는 무엇입니까?
ifly6

8

위의 답변 외에도 단일 단어 이름이없는 열에 대해 다음을 사용할 수 있습니다.

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

도움이 되었기를 바랍니다.


0

나는 왜 (실제로 답을 찾기 위해 여기에 왔음) 100 %는 아니지만 이것도 작동하며 모든 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]

또는없이 작동합니다 .loc.

괄호로 인덱싱 할 때 이해하기 때문에 이것이 왜 작동하는지 모르겠습니다. pandas는 괄호 안에있는 것이 무엇이든 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.