IT

팬더의 데이터 프레임에서 숫자가 아닌 행을 찾습니까?

itgroup 2023. 9. 10. 12:10
반응형

팬더의 데이터 프레임에서 숫자가 아닌 행을 찾습니까?

팬더에는 인덱스로 사용되는 열을 제외하고 숫자 값만 포함하는 큰 데이터 프레임이 있습니다.

df = pd.DataFrame({'a': [1, 2, 3, 'bad', 5],
                   'b': [0.1, 0.2, 0.3, 0.4, 0.5],
                   'item': ['a', 'b', 'c', 'd', 'e']})
df = df.set_index('item')

데이터 프레임의 행을 어떻게 찾습니까?df그 안에 비제한적인 가치가 있는?

이 예에서는 데이터 프레임의 네 번째 행으로 문자열이 있습니다.'bad'에서a기둥.이 행은 어떻게 프로그래밍 방식으로 찾을 수 있습니까?

를 사용하여 각 요소의 유형을 확인할 수 있습니다(applymap은 DataFrame의 각 요소에 함수를 적용함).

In [11]: df.applymap(np.isreal)
Out[11]:
          a     b
item
a      True  True
b      True  True
c      True  True
d     False  True
e      True  True

행의 모든 것이 참이면 모든 숫자가 됩니다.

In [12]: df.applymap(np.isreal).all(1)
Out[12]:
item
a        True
b        True
c        True
d       False
e        True
dtype: bool

따라서 루지의 서브DataFrame을 가져오려면 (참고: 위의 부정, ~는 적어도 하나의 부정한 숫자를 가지는 것을 찾습니다):

In [13]: df[~df.applymap(np.isreal).all(1)]
Out[13]:
        a    b
item
d     bad  0.4

argmin을 사용할 수 있는 초범의 위치도 찾을 수 있습니다.

In [14]: np.argmin(df.applymap(np.isreal).all(1))
Out[14]: 'd'

@CTZhu가 지적한 바와 같이 int 또는 float의 인스턴스인지 확인하는 것이 약간 더 빠를 수 있습니다(np.isreal과 함께 추가 오버헤드가 있습니다).

df.applymap(lambda x: isinstance(x, (int, float)))

이미 이 질문에 대한 몇 가지 훌륭한 답변이 있습니다. 그러나 여기 일부 열에 숫자가 아닌 값이 있는 경우 행을 삭제할 때 정기적으로 사용하는 멋진 토막이 있습니다.

# Eliminate invalid data from dataframe (see Example below for more context)

num_df = (df.drop(data_columns, axis=1)
         .join(df[data_columns].apply(pd.to_numeric, errors='coerce')))

num_df = num_df[num_df[data_columns].notnull().all(axis=1)]

이게 작동하는 방법은 우리가 먼저drop모든.data_columns로부터df, 그 다음에 a를 사용합니다.join통과시킨 후 다시 집어넣다pd.to_numeric(옵션 포함)'coerce', 모든 비선택 항목이 다음으로 변환되도록 합니다.NaN)에 저장됩니다.num_df.

두 번째 줄에서는 모든 값이 null이 아닌 행만 유지하는 필터를 사용합니다.

참고:pd.to_numeric강요하고 있습니다NaN숫자 값으로 변환할 수 없는 모든 것이 숫자 값을 나타내는 문자열이 제거되지 않습니다.예를들면'1.25'숫자 값으로 인식됩니다.1.25.

면책 사항:pd.to_numeric팬더 버전으로 소개되었습니다.0.17.0

예:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({"item": ["a", "b", "c", "d", "e"],
   ...:                    "a": [1,2,3,"bad",5],
   ...:                    "b":[0.1,0.2,0.3,0.4,0.5]})

In [3]: df
Out[3]: 
     a    b item
0    1  0.1    a
1    2  0.2    b
2    3  0.3    c
3  bad  0.4    d
4    5  0.5    e

In [4]: data_columns = ['a', 'b']

In [5]: num_df = (df
   ...:           .drop(data_columns, axis=1)
   ...:           .join(df[data_columns].apply(pd.to_numeric, errors='coerce')))

In [6]: num_df
Out[6]: 
  item   a    b
0    a   1  0.1
1    b   2  0.2
2    c   3  0.3
3    d NaN  0.4
4    e   5  0.5

In [7]: num_df[num_df[data_columns].notnull().all(axis=1)]
Out[7]: 
  item  a    b
0    a  1  0.1
1    b  2  0.2
2    c  3  0.3
4    e  5  0.5
# Original code
df = pd.DataFrame({'a': [1, 2, 3, 'bad', 5],
                   'b': [0.1, 0.2, 0.3, 0.4, 0.5],
                   'item': ['a', 'b', 'c', 'd', 'e']})
df = df.set_index('item')

잘못된 값을 'n'으로 채우는 'corce'를 사용하여 숫자로 변환

a = pd.to_numeric(df.a, errors='coerce')

isna를 사용하여 부울 인덱스를 반환합니다.

idx = a.isna()

해당 인덱스를 데이터 프레임에 적용합니다.

df[idx]

산출량

잘못된 데이터가 들어 있는 행을 반환합니다.

        a    b
item          
d     bad  0.4

혼란을 드려 죄송합니다. 올바른 접근 방법이어야 합니다.캡처만 하시겠습니까?'bad'단지, 그런 것들이 아닙니다.'good'; 아니면 그냥 숫자가 아닌 값?

In[15]:
np.where(np.any(np.isnan(df.convert_objects(convert_numeric=True)), axis=1))
Out[15]:
(array([3]),)

저는 생각하고 있어요, 그냥 아이디어를 줘요, 열을 문자열로 변환하고, 문자열을 사용하는 것이 더 쉽죠.그러나 이것은 숫자를 포함하는 문자열에서는 작동하지 않습니다. 예를 들어,bad123.그리고.~선택의 보약을 취하고 있습니다.

df['a'] = df['a'].astype(str)
df[~df['a'].str.contains('0|1|2|3|4|5|6|7|8|9')]
df['a'] = df['a'].astype(object)

을 합니다.'|'.join([str(i) for i in range(10)])를 발생시키다'0|1|...|8|9'

또는 사용하기np.isreal() 투표를 받은 은은럼수장수럼은n은,ee를 .

df[~df['a'].apply(lambda x: np.isreal(x))]

문자열 값이 있는 열을 사용하는 경우 VERY FULLY Function series.str.isnumeric()을 다음과 같이 사용할 수 있습니다.

a = pd.Series(['hi','hola','2.31','288','312','1312', '0,21', '0.23'])

이 열을 새 열로 복사하고 str.replace('.',') 및 str.replace(',',')를 수행한 다음 숫자 값을 선택합니다.그리고:

a = a.str.replace('.','')
a = a.str.replace(',','') 
a.str.isnumeric()

Out[15]: 0 False 1 False 2 True 3 True 4 True 5 True 6 True 7 True type: bool

모두들 행운을 빌어요!

.astype()을 사용하여 데이터를 변환했습니까?

위의 좋은 댓글들은 모두 99%의 사례를 해결해야 하지만, 그래도 문제가 있다면 데이터 타입을 변환했는지도 확인해주시기 바랍니다.

가끔 메모리를 저장하기 위해 데이터를 float16으로 강제 입력합니다.사용방법:

df[col] = df[col].astype(np.float16)

하지만 이것은 당신의 암호를 잠자코 깨뜨릴 수 있습니다.따라서 데이터 유형 변환을 수행한 경우 오버플로를 두 번 확인합니다.변환을 사용하지 않고 다시 시도합니다.

저한테는 통했어요!

언급URL : https://stackoverflow.com/questions/21771133/finding-non-numeric-rows-in-dataframe-in-pandas

반응형