팬더의 데이터 프레임에서 숫자가 아닌 행을 찾습니까?
팬더에는 인덱스로 사용되는 열을 제외하고 숫자 값만 포함하는 큰 데이터 프레임이 있습니다.
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
'IT' 카테고리의 다른 글
jQuery를 사용하여 클릭 시 앵커 텍스트/href를 가져오는 방법? (0) | 2023.09.10 |
---|---|
각도 6 : http 통화 중 응답 유형을 텍스트로 설정하는 방법 (0) | 2023.09.10 |
Oracle에서 날짜 부분만을 기준으로 두 DATE 값을 비교하는 방법은 무엇입니까? (0) | 2023.09.10 |
phpmyadmin 서버 유형에서 중복 레코드 찾기:마리아DB (0) | 2023.09.10 |
멀티 테넌트 지원을 위한 Sequelize에서 데이터베이스 동적 정의 잘못된 쿼리 구문 반환 (0) | 2023.09.10 |