programing

특정 컬럼의 값이 NaN인 Panda DataFrame 행을 삭제하는 방법

shortcode 2022. 9. 29. 23:53
반응형

특정 컬럼의 값이 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.dropnaNaNs를 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

반응형