Python python กรองน่านจากการเลือกข้อมูลของคอลัมน์ของสตริง


190

โดยไม่ใช้groupbyฉันจะกรองข้อมูลโดยไม่ได้NaNอย่างไร

สมมติว่าฉันมีเมทริกซ์ที่ลูกค้าจะเติมใน 'N / A', 'n / a' หรือรูปแบบใด ๆ ของมันและอื่น ๆ ปล่อยให้มันว่างเปล่า:

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [3., 4., 5., np.nan, np.nan, np.nan],
                  'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})

nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]

เอาท์พุท:

>>> nms
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

ฉันจะกรองค่า NaN อย่างไรเพื่อที่ฉันจะได้รับผลลัพธ์การทำงานเช่นนี้:

  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

ฉันเดาว่าฉันต้องการบางอย่าง~np.isnanแต่ทิลดาไม่ทำงานกับสายอักขระ

คำตอบ:


257

เพียงแค่วางพวกเขา:

nms.dropna(thresh=2)

NaNนี้จะลดลงแถวทั้งหมดที่มีอย่างน้อยสองไม่ใช่

จากนั้นคุณสามารถวางที่ชื่อNaN:

In [87]:

nms
Out[87]:
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

[5 rows x 3 columns]
In [89]:

nms = nms.dropna(thresh=2)
In [90]:

nms[nms.name.notnull()]
Out[90]:
  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

[2 rows x 3 columns]

แก้ไข

การดูสิ่งที่คุณต้องการในตอนแรกคุณสามารถทำได้โดยไม่ต้องdropnaโทร

nms[nms.name.notnull()]

UPDATE

เมื่อดูที่คำถามนี้ในอีก 3 ปีต่อมามีข้อผิดพลาดประการแรกthreshหาค่าอย่างน้อยก็nไม่ใช่อาร์คNaNดังนั้นในความเป็นจริงผลลัพธ์ควรจะเป็น:

In [4]:
nms.dropna(thresh=2)

Out[4]:
  movie    name  rating
0   thg    John     3.0
1   thg     NaN     4.0
3   mol  Graham     NaN

เป็นไปได้ว่าฉันถูกเข้าใจผิดเมื่อ 3 ปีก่อนหรือว่านุ่นรุ่นที่ฉันใช้มีข้อผิดพลาดทั้งสองสถานการณ์เป็นไปได้ทั้งหมด


194

วิธีแก้ปัญหาที่ง่ายที่สุด:

filtered_df = df[df['name'].notnull()]

ดังนั้นจึงกรองเฉพาะแถวที่ไม่มีค่า NaN ในคอลัมน์ 'ชื่อ'

สำหรับหลายคอลัมน์:

filtered_df = df[df[['name', 'country', 'region']].notnull().all(1)]


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