특정 열의 값이 NaN 인 Pandas DataFrame의 행을 삭제하는 방법 원합니다 NaN. >>> df

나는 이것을 가지고 DataFrame있으며 EPS열이 아닌 레코드 만 원합니다 NaN.

>>> 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

df.drop(....)이 결과 데이터 프레임을 얻는 것과 같은 것 :

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

어떻게합니까?



답변

EPS가 NA가 아닌 행을 가져 가십시오.

df = df[df['EPS'].notna()]


답변

이 질문은 이미 해결되었지만 …

… 또한 원래 의견 에서 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

행 대신 열 삭제를 포함하여 다른 옵션도 있습니다 ( http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html의 문서 참조 ).

꽤 편리합니다!


답변

나는 이것이 이미 답변되었지만 아만 (일반적으로 훌륭함)의 일반적인 설명과는 달리이 특정 질문에 대한 순수한 판다 솔루션을 위해 다른 사람 이이 문제를 겪을 경우를 대비하여 알고 있습니다.

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


답변

이것을 사용할 수 있습니다 :

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


답변

가장 간단한 솔루션 :

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

위의 솔루션은 np.isfinite ()를 사용하는 것보다 낫습니다.


답변

당신은 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'],inplace=True)

출처 : https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html