忽略带有str.contains的NaN


117

我想查找包含字符串的行,如下所示:

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

但是,这失败了,因为某些元素是NaN:

ValueError:无法使用包含NA / NaN值的向量建立索引

所以我诉诸于混乱

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

有没有更好的办法?

Answers:


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()。所以,提示:请确保将列类型设置为in read_csv()或之后再进行类似df = df.where(pandas.notnull(df), "nan")LOL的操作
dmn

为什么df.loc而不仅仅是df
PascalVKooten

@PascalVKooten都很好,我喜欢.loc,因为imo更加明确。
安迪·海登

1
Ya救了我...如果不是在这里,我想我会经历两个星期的噩梦,将我的头撞到墙上:-)绝对值得+1,哈哈
U10-Forward 19'May

5
大声笑为什么不默认?
ifly6 '19

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会将方括号内的内容评估为TrueFalse。我不知道为什么在方括号“ extra boolean”中添加该短语完全没有效果。



-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 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.