특정 열의 값이 NaN 인 Pandas DataFrame의 행을 삭제하는 방법
나는 이것을 가지고 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
어떻게하나요?
하지 마십시오 drop
. 여기서 그냥 행을 가지고 EPS
있다 유한 :
import numpy as np
df = df[np.isfinite(df['EPS'])]
이 질문은 이미 해결되었지만 ...
... 또한 Wouter가 원래 의견 에서 제안한 솔루션을 고려하십시오 . 를 포함하여 누락 된 데이터를 처리하는 기능 dropna()
은 Pandas에 명시 적으로 내장되어 있습니다. 수동으로 수행하는 것보다 잠재적으로 성능이 향상되는 것 외에도 이러한 기능에는 유용한 다양한 옵션이 제공됩니다.
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
There are also other options (See docs at http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html), including dropping columns instead of rows.
Pretty handy!
I know this has already been answered, but just for the sake of a purely pandas solution to this specific question as opposed to the general description from Aman (which was wonderful) and in case anyone else happens upon this:
import pandas as pd
df = df[pd.notnull(df['EPS'])]
You can use this:
df.dropna(subset=['EPS'], how='all', inplace = True)
Simplest of all solutions:
filtered_df = df[df['EPS'].notnull()]
The above solution is way better than using np.isfinite()
You could use dataframe method notnull or inverse of isnull, or 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
you can use dropna
Example
Drop the rows where at least one element is missing.
df=df.dropna()
Define in which columns to look for missing values.
df=df.dropna(subset=['column1', 'column1'])
See this for more examples
Note: axis parameter of dropna is deprecated since version 0.23.0:
Simple and easy way
df.dropna(subset=['EPS'],inplace=True)
source: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
yet another solution which uses the fact that np.nan != np.nan
:
In [149]: df.query("EPS == EPS")
Out[149]:
STK_ID EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
It may be added at that '&' can be used to add additional conditions e.g.
df = df[(df.EPS > 2.0) & (df.EPS <4.0)]
Notice that when evaluating the statements, pandas needs parenthesis.
For some reason none of the previously submitted answers worked for me. This basic solution did:
df = df[df.EPS >= 0]
Though of course that will drop rows with negative numbers, too. So if you want those it's probably smart to add this after, too.
df = df[df.EPS <= 0]
One of the solution can be
df = df[df.isnull().sum(axis=1) <= Cutoff Value]
Another way can be
df= df.dropna(thresh=(df.shape[1] - Cutoff_value))
I hope these are useful.
'programing' 카테고리의 다른 글
이중 또는 단일 대괄호, 괄호, 중괄호 사용 방법 (0) | 2020.10.02 |
---|---|
C #을 사용하여 메서드를 매개 변수로 전달 (0) | 2020.10.02 |
Android에서 인터넷 액세스를 확인하는 방법은 무엇입니까? (0) | 2020.10.02 |
Android 소스 코드는 온라인에서 어디에서 찾을 수 있습니까? (0) | 2020.10.02 |
HTTP DELETE 요청에 엔티티 본문이 허용됩니까? (0) | 2020.10.02 |