programing

str.contains를 사용하여 NaN을 무시합니다.

nicescript 2022. 10. 20. 21:25
반응형

str.contains를 사용하여 NaN을 무시합니다.

다음과 같이 문자열을 포함하는 행을 찾습니다.

DF[DF.col.str.contains("foo")]

단, 이는 일부 요소가 NaN이기 때문에 실패합니다.

ValueError: NA/NaN 값을 포함하는 벡터로 인덱싱할 수 없습니다.

그래서 나는 난독화 된 것에 의지한다.

DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]

더 좋은 방법이 있을까요?

거기에 깃발이 있다.

In [11]: df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

In [12]: df.a.str.contains("foo")
Out[12]:
0     True
1     True
2    False
3      NaN
Name: a, dtype: object

In [13]: df.a.str.contains("foo", na=False)
Out[13]:
0     True
1     True
2    False
3    False
Name: a, dtype: bool

다음의 문서를 참조해 주세요.

na : 기본 NaN. 결측값 입력.


따라서 다음 작업을 수행할 수 있습니다.

In [21]: df.loc[df.a.str.contains("foo", na=False)]
Out[21]:
      a
0  foo1
1  foo2

위의 답변 외에 단어 이름이 없는 열에 대해서는 다음을 사용할 수 있습니다.-

df[df['Product ID'].str.contains("foo") == True]

이게 도움이 됐으면 좋겠다.

df[df.col.str.contains("foo").fillna(False)]

(실제로 답을 찾기 위해 여기에 온) 이유를 100% 알 수는 없지만, 이것도 작동하며 모든 nan 값을 교체할 필요는 없습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

newdf = df.loc[df['a'].str.contains('foo') == True]

유무에 관계없이 기능.loc.

이게 왜 효과가 있는지 모르겠어요. 브라켓으로 지수를 작성하면 판다는 브라켓 안에 뭐가 있는지 평가합니다.True또는False괄호 안에 있는 문구를 '추가 부울'로 하는 것이 왜 효과가 있는지 전혀 알 수 없습니다.

를 사용할 수도 있습니다.query다음과 같이 부울식을 사용하여 DataFrame 열을 쿼리하는 메서드입니다.

df.query('a.str.contains("foo", na=False)')

퍼포먼스는 향상되지 않을 수 있지만 (논쟁의의 여지가 있는) 가독성이 향상됩니다.

다음과 같이 할 수도 있습니다.

DF[DF.col.str.contains(pat = '(foo)', regex = True) ]

언급URL : https://stackoverflow.com/questions/28311655/ignoring-nans-with-str-contains

반응형