पाइथन पैंडस स्ट्रिंग्स के एक कॉलम के डेटा चयन से नैनो को फ़िल्टर करना


190

बिना उपयोग के groupbyमैं डेटा को बिना फ़िल्टर कैसे करूंगा NaN?

मान लें कि मेरे पास एक मैट्रिक्स है जहां ग्राहक 'एन / ए', 'एन / ए' या इसके किसी भी रूपांतर को भरेंगे और अन्य लोग इसे पसंद करेंगे:

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लेकिन टिल्डा तार के साथ काम नहीं करता है।

जवाबों:


256

बस उन्हें छोड़ दो:

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

अपडेट करें

इस प्रश्न को 3 साल बाद देखते हुए, एक गलती है, सबसे पहले thresharg कम से कम 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 साल पहले या तो गलत था या मेरे द्वारा चलाए जा रहे पांडा के संस्करण में बग था, दोनों परिदृश्य पूरी तरह से संभव हैं।


191

सभी समाधानों में सबसे सरल:

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

इस प्रकार, यह केवल उन पंक्तियों को फ़िल्टर करता है जिनमें 'नाम' कॉलम में NaN मान नहीं हैं।

कई स्तंभों के लिए:

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

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

for col in df.columns:
    df = df[~pd.isnull(df[col])]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.