ละเว้น NaN ที่มี str.contains


118

ฉันต้องการค้นหาแถวที่มีสตริงดังนี้:

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

อย่างไรก็ตามสิ่งนี้ล้มเหลวเนื่องจากองค์ประกอบบางอย่างเป็น NaN:

ValueError: ไม่สามารถสร้างดัชนีด้วยเวกเตอร์ที่มีค่า NA / NaN

ดังนั้นฉันจึงหันไปหาสิ่งที่สับสน

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

มีวิธีที่ดีกว่า?

คำตอบ:


227

มีธงสำหรับสิ่งนั้น:

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
ยาช่วยฉันไว้ ... ถ้าไม่อยู่ที่นี่ฉันคิดว่าฉันคงผ่านฝันร้ายมาสองสัปดาห์โดยเอาหัวโขกกำแพง :-) คุ้มค่า +1 แน่นอนฮ่า ๆ
U10-Forward

5
ฮ่า ๆ ทำไมไม่เป็นค่าเริ่มต้น?
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.