특정 컬럼의 값이 NaN인 Panda DataFrame 행을 삭제하는 방법
게 요.DataFrame
「」의만을 요구하고 있습니다.EPS
column column column column column column column가 아니다.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),의 문서를 참조하십시오).
꽤 편리하네요!
이 질문에 대한 답은 이미 나왔다는 것을 알지만, Aman의 일반적인 설명과는 달리 이 특정 질문에 대한 순수한 판다의 해결책을 위해, 그리고 다른 누군가가 이것에 대해 발생할 경우에 대비해서:
import pandas as pd
df = df[pd.notnull(df['EPS'])]
다음을 사용할 수 있습니다.
df.dropna(subset=['EPS'], how='all', inplace=True)
특정 컬럼의 값이 NaN인 Panda DataFrame 행을 삭제하는 방법
이것은 죽도록 두들겨 맞은 오래된 질문이지만 나는 이 문제에 대해 더 많은 유용한 정보가 있다고 믿는다.다음의 몇개의 질문에 대한 답을 찾고 있는 경우는, 계속 읽어 주세요.
- 값에 NaN이 있는 경우 행을 드롭할 수 있습니까?다 NaN이면 어떡해요?
- 행을 삭제할 때 특정 열의 NaN만 볼 수 있습니까?
- 특정 개수의 NaN 값을 가진 행을 드롭할 수 있습니까?
- 행 대신 열을 드롭하려면 어떻게 해야 합니까?
- 위의 모든 옵션을 시도해 봤지만 Data Frame이 업데이트되지 않습니다!
DataFrame.dropna
: 사용방법 및 예시
다 df.dropna
NaNs를 Data Frames에서 삭제하는 표준적인 방법이지만, 그 과정에서 도움이 되는 몇 가지 시각적 단서만큼 좋은 것은 없습니다.
# Setup
df = pd.DataFrame({
'A': [np.nan, 2, 3, 4],
'B': [np.nan, np.nan, 2, 3],
'C': [np.nan]*3 + [3]})
df
A B C
0 NaN NaN NaN
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
다음은 가장 중요한 주장과 그 작동 방식을 FAQ 형식으로 정리한 것입니다.
값에 NaN이 있는 경우 행을 드롭할 수 있습니까?다 NaN이면 어떡해요?
서부터 「」가 됩니다.how=...
논쟁은 도움이 된다. 하다, 하다, 하다, 하다, 하다 중 하나가 될 수 요.
'any'
( - 에 NaN(' ') - 'NaN'이'all'
이 있는 합니다.
<!_ ->
# Removes all but the last row since there are no NaNs
df.dropna()
A B C
3 4.0 3.0 3.0
# Removes the first row only
df.dropna(how='all')
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
★★★
어떤 행이 늘인지 확인하는 경우(IOW, 행의 부울 마스크가 필요한 경우)는 다음과 같이 사용합니다.df.isna() A B C 0 True True True 1 False True True 2 False False True 3 False False False df.isna().any(axis=1) 0 True 1 True 2 True 3 False dtype: bool
이 결과의 반전을 가져오려면 대신 을 사용하십시오.
행을 삭제할 때 특정 열의 NaN만 볼 수 있습니까?
이것은, 의 사용 예입니다.subset=[...]
★★★★★★ 。
)을 합니다.axis=1
이 에 더더또또또또또또또또또또또)axis=1
드롭하는 경우( 「(」가 붙은 axis=1
.
# Drop all rows with NaNs in A
df.dropna(subset=['A'])
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
# Drop all rows with NaNs in A OR B
df.dropna(subset=['A', 'B'])
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
특정 개수의 NaN 값을 가진 행을 드롭할 수 있습니까?
이것은, 의 사용 예입니다.thresh=...
수를정수로 합니다.NON-NULL은 NON-NULL이 아닌 NON-NULL은 NON-NULL입니다.
df.dropna(thresh=1)
A B C
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
df.dropna(thresh=2)
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
df.dropna(thresh=3)
A B C
3 4.0 3.0 3.0
여기서 주의할 점은 삭제할 NULL 값의 수가 아니라 유지할 NON-NULL 값의 수를 지정해야 한다는 것입니다.이것은 신규 유저의 과제입니다.
다행히 수정은 간단합니다.NULL 값의 카운트가 있는 경우 열 크기에서 빼서 함수에 대한 올바른 인수를 얻을 수 있습니다.
required_min_null_values_to_drop = 2 # drop rows with at least 2 NaN
df.dropna(thresh=df.shape[1] - required_min_null_values_to_drop + 1)
A B C
2 3.0 2.0 NaN
3 4.0 3.0 3.0
행 대신 열을 드롭하려면 어떻게 해야 합니까?
하다를 사용하세요.axis=...
논증, 논증, 논증, 논증, 논증, 논증, 논증, 논증, 논증, 논증 .axis=0
★★★★★★★★★★★★★★★★★」axis=1
.
에 알립니다(행 삭제 여부).axis=0
드롭 Drop Columns')axis=1
를 참조해 주세요.
df.dropna()
A B C
3 4.0 3.0 3.0
# All columns have rows, so the result is empty.
df.dropna(axis=1)
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
# Here's a different example requiring the column to have all NaN rows
# to be dropped. In this case no columns satisfy the condition.
df.dropna(axis=1, how='all')
A B C
0 NaN NaN NaN
1 2.0 NaN NaN
2 3.0 2.0 NaN
3 4.0 3.0 3.0
# Here's a different example requiring a column to have at least 2 NON-NULL
# values. Column C has less than 2 NON-NULL values, so it should be dropped.
df.dropna(axis=1, thresh=2)
A B
0 NaN NaN
1 2.0 NaN
2 3.0 2.0
3 4.0 3.0
위의 모든 옵션을 시도해 봤지만 Data Frame이 업데이트되지 않습니다!
dropna
의 함수와 DataFrame이 내용을 해야 합니다.panda API >른른 、 DataFrame ( 경변 ) 。
df.dropna(...) # wrong
df.dropna(..., inplace=True) # right, but not recommended
df = df.dropna(...) # right
언급
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
DataFrame.dropna( self, axis=0, how='any', thresh=None, subset=None, inplace=False)
가장 심플한 솔루션:
filtered_df = df[df['EPS'].notnull()]
위의 솔루션은 np.isfinite()를 사용하는 것보다 훨씬 우수합니다.
심플하고 쉬운 방법
df.dropna(subset=['EPS'],inplace=True)
출처 : https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
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
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
다른 버전:
df[~df['EPS'].isna()]
'&'를 사용하여 예를 들어 추가 조건을 추가할 수 있습니다.
df = df[(df.EPS > 2.0) & (df.EPS <4.0)]
그 진술을 평가할 때, 팬더에게는 괄호가 필요합니다.
데이터 집합의 열 수가 많은 경우 null 값이 포함된 열의 수와 포함되지 않은 열의 수를 확인하는 것이 훨씬 좋습니다.
print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))
print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))
print("Total no. of columns in the dataframe")
print(len(df.columns))
예를 들어 데이터 프레임에는 82개의 열이 포함되어 있으며, 그 중 19개는 최소 1개의 null 값을 포함하고 있습니다.
또한 어떤 null 값이 더 많은지에 따라 콜과 행을 자동으로 제거할 수도 있습니다.
이것을 인텔리전트하게 실행하는 코드는 다음과 같습니다.
df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)
주의: 위의 코드는 모든 null 값을 삭제합니다.null 값을 원할 경우 미리 처리하십시오.
다음과 같은 방법이 나에게 효과가 있었다.위의 방법이 모두 작동하지 않는 경우 도움이 됩니다.
df[df['colum_name'].str.len() >= 1]
기본 개념은 길이 강도가 1보다 큰 경우에만 레코드를 선택하는 것입니다.이 기능은 문자열 데이터를 처리할 때 특히 유용합니다.
최고!
inside 를 사용할 수도 있습니다.
In [4]: df.query('EPS.notna().values')
Out[4]:
STK_ID.1 EPS cash
STK_ID RPT_Date
600016 20111231 600016 4.3 NaN
601939 20111231 601939 2.5 NaN
다음과 같이 시험해 볼 수 있습니다.
df['EPS'].dropna()
언급URL : https://stackoverflow.com/questions/13413590/how-to-drop-rows-of-pandas-dataframe-whose-value-in-a-certain-column-is-nan
'programing' 카테고리의 다른 글
숫자의 정수와 십진수를 구하는 방법은? (0) | 2022.09.29 |
---|---|
Python에서 현재 날짜와 시간으로 파일 이름을 만드는 방법은 무엇입니까? (0) | 2022.09.29 |
JPA/Hibernate에서의 flash()의 올바른 사용 (0) | 2022.09.29 |
Json Array를 일반 Java 목록으로 변환 (0) | 2022.09.29 |
.view()는 PyTorch에서 무엇을 합니까? (0) | 2022.09.25 |