[python] 파이썬 팬더 문자열 열의 데이터 선택에서 난 필터링

사용하지 않고 groupby어떻게 데이터를 필터링하지 NaN않습니까?

고객이 ‘N / A’, ‘n / a’또는 그 변형을 채우고 다른 사람들은 비워 두는 매트릭스가 있다고 가정 해 보겠습니다.

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [3., 4., 5., np.nan, np.nan, np.nan],
                  'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})

nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]

산출:

>>> nms
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

NaN 값을 어떻게 필터링하여 다음과 같이 결과를 얻을 수 있습니까?

  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

나는 비슷한 ~np.isnan것이 필요하다고 생각 하지만 tilda는 문자열로 작동하지 않습니다.



답변

그냥 버리세요 :

nms.dropna(thresh=2)

이것은 적어도 두 개가 아닌 모든 행을 삭제합니다 NaN.

그런 다음 name은 다음 위치에 놓을 수 있습니다 NaN.

In [87]:

nms
Out[87]:
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

[5 rows x 3 columns]
In [89]:

nms = nms.dropna(thresh=2)
In [90]:

nms[nms.name.notnull()]
Out[90]:
  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

[2 rows x 3 columns]

편집하다

실제로 원래 원하는 것을보고 dropna전화 하지 않고이 작업을 수행 할 수 있습니다 .

nms[nms.name.notnull()]

최신 정보

3 년 후이 질문을 보면 실수가 있습니다. 먼저 thresharg는 적어도 값이 n아닌 NaN값을 찾습니다 . 실제로 출력은 다음과 같아야합니다.

In [4]:
nms.dropna(thresh=2)

Out[4]:
  movie    name  rating
0   thg    John     3.0
1   thg     NaN     4.0
3   mol  Graham     NaN

내가 3 년 전에 잘못 생각했거나 내가 실행중인 판다 버전에 버그가 있었을 수 있습니다. 두 시나리오 모두 가능합니다.


답변

가장 간단한 솔루션 :

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

따라서 ‘name’열에 NaN 값이없는 행만 필터링합니다.

여러 열의 경우 :

filtered_df = df[df[['name', 'country', 'region']].notnull().all(1)]


답변

df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})

for col in df.columns:
    df = df[~pd.isnull(df[col])]


답변

df.dropna(subset=['columnName1', 'columnName2'])


답변