python - كيفية إسقاط صفوف من Pandas DataFrame التي قيمتها في أعمدة معينة NaN




(6)

أعلم أن هذا قد تم الإجابة عليه بالفعل ، ولكن فقط من أجل حل الباندا الخالص لهذا السؤال المحدد في مقابل الوصف العام من أمان (والذي كان رائعا) وفي حالة حدوث أي شخص آخر على هذا:

import pandas as pd
df = df[pd.notnull(df['EPS'])]

لدي DataFrame :

>>> df
                 STK_ID  EPS  cash
STK_ID RPT_Date                   
601166 20111231  601166  NaN   NaN
600036 20111231  600036  NaN    12
600016 20111231  600016  4.3   NaN
601009 20111231  601009  NaN   NaN
601939 20111231  601939  2.5   NaN
000001 20111231  000001  NaN   NaN

ثم أريد فقط أن السجلات التي لا يكون EPS عبارة عن NaN ، أي ، df.drop(....) ستعيد مخطط البيانات كما هو موضح أدناه:

                  STK_ID  EPS  cash
STK_ID RPT_Date                   
600016 20111231  600016  4.3   NaN
601939 20111231  601939  2.5   NaN

كيف يمكنني فعل ذلك؟


تم حل هذا السؤال بالفعل ، ولكن ...

... أيضا النظر في الحل الذي اقترحه Wouter في تعليقه الأصلي . وقد بنيت القدرة على التعامل مع البيانات المفقودة ، بما في ذلك dropna() ، في الباندا بشكل صريح. وبغض النظر عن الأداء المحسن المحتمل على القيام بذلك يدويًا ، فإن هذه الوظائف تأتي أيضًا مع مجموعة متنوعة من الخيارات التي قد تكون مفيدة.

In [24]: df = pd.DataFrame(np.random.randn(10,3))

In [25]: df.iloc[::2,0] = np.nan; df.iloc[::4,1] = np.nan; df.iloc[::3,2] = np.nan;

In [26]: df
Out[26]:
          0         1         2
0       NaN       NaN       NaN
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN
In [27]: df.dropna()     #drop all rows that have any NaN values
Out[27]:
          0         1         2
1  2.677677 -1.466923 -0.750366
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295
In [28]: df.dropna(how='all')     #drop only if ALL columns are NaN
Out[28]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN
In [29]: df.dropna(thresh=2)   #Drop row if it does not have at least two values that are **not** NaN
Out[29]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN
In [30]: df.dropna(subset=[1])   #Drop only if NaN in specific column (as asked in the question)
Out[30]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

هناك أيضًا خيارات أخرى (راجع المستندات على pandas.pydata.org/pandas-docs/stable/generated/… ) ، بما في ذلك إسقاط الأعمدة بدلاً من الصفوف.

سهل جدا!


لا drop ما عليك سوى اتخاذ صفوف حيث يكون EPS محددًا :

df = df[np.isfinite(df['EPS'])]

لسبب ما لم يعمل أي من الإجابات المقدمة سابقا بالنسبة لي. هذا الحل الأساسي فعل:

df = df[df.EPS >= 0]

على الرغم من ذلك بالطبع سوف تسقط الصفوف مع الأرقام السلبية ، أيضا. لذلك إذا كنت تريد أن يكون من الذكاء إضافة هذا بعد ، أيضًا.

df = df[df.EPS <= 0]

يمكنك استخدام طريقة dataframe notnull أو معكوس isnull ، أو numpy.isnan :

In [332]: df[df.EPS.notnull()]
Out[332]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [334]: df[~df.EPS.isnull()]
Out[334]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [347]: df[~np.isnan(df.EPS)]
Out[347]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN

يمكنك استخدام هذا:

df.dropna(subset=['EPS'], how='all', inplace = True)




dataframe