Pandas/NumPy에서 열/변수가 숫자인지 여부를 확인하는 방법은 무엇입니까?
변수가 다음에 있는지 여부를 확인할 수 있는 더 나은 방법이 있습니까?Pandas
및/또는NumPy
이라numeric
아니면 안 되나요?
나는 정의된 자아가 있습니다.dictionary
와 함께dtypes
열쇠로numeric
/not
가치로서
인pandas 0.20.2
할 수 있는 일:
import pandas as pd
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1.0, 2.0, 3.0]})
is_string_dtype(df['A'])
>>>> True
is_numeric_dtype(df['B'])
>>>> True
dtype이 다음의 하위 유형인지 확인하는 데 사용할 수 있습니다.np.number
예:
np.issubdtype(arr.dtype, np.number) # where arr is a numpy array
np.issubdtype(df['X'].dtype, np.number) # where df['X'] is a pandas Series
이것은 numpy의 d형에는 효과가 있지만 pd와 같은 팬더의 특정 유형에는 실패합니다.토마스가 언급한 것처럼 단정적입니다.판다의 범주형 함수를 사용하는 경우 np.issubd 유형보다 더 나은 대안입니다.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0],
'C': [1j, 2j, 3j], 'D': ['a', 'b', 'c']})
df
Out:
A B C D
0 1 1.0 1j a
1 2 2.0 2j b
2 3 3.0 3j c
df.dtypes
Out:
A int64
B float64
C complex128
D object
dtype: object
np.issubdtype(df['A'].dtype, np.number)
Out: True
np.issubdtype(df['B'].dtype, np.number)
Out: True
np.issubdtype(df['C'].dtype, np.number)
Out: True
np.issubdtype(df['D'].dtype, np.number)
Out: False
여러 열에 대해 np.vectorize를 사용할 수 있습니다.
is_number = np.vectorize(lambda x: np.issubdtype(x, np.number))
is_number(df.dtypes)
Out: array([ True, True, True, False], dtype=bool)
그리고 선택을 위해, 판다들은 이제 다음을 가지고 있습니다.
df.select_dtypes(include=[np.number])
Out:
A B C
0 1 1.0 1j
1 2 2.0 2j
2 3 3.0 3j
@jaime 님의 댓글 답변을 바탕으로 확인이 필요합니다..dtype.kind
이자란에 대하여예를 들어,
>>> import pandas as pd
>>> df = pd.DataFrame({'numeric': [1, 2, 3], 'not_numeric': ['A', 'B', 'C']})
>>> df['numeric'].dtype.kind in 'biufc'
>>> True
>>> df['not_numeric'].dtype.kind in 'biufc'
>>> False
NB 의 의미biufc
:b
쿨,i
int(서명됨),u
서명되지 않은 int,f
흘러가다,c
복잡한.https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind 을 참조하십시오.
판다들은 가지고 있습니다.select_dtype
기능.다음과 같이 int64 및 float64에서 열을 쉽게 필터링할 수 있습니다.
df.select_dtypes(include=['int64','float64'])
숫자 유형 데이터만 반환하는 유사 내부 방법입니다.
In [27]: df = DataFrame(dict(A = np.arange(3),
B = np.random.randn(3),
C = ['foo','bar','bah'],
D = Timestamp('20130101')))
In [28]: df
Out[28]:
A B C D
0 0 -0.667672 foo 2013-01-01 00:00:00
1 1 0.811300 bar 2013-01-01 00:00:00
2 2 2.020402 bah 2013-01-01 00:00:00
In [29]: df.dtypes
Out[29]:
A int64
B float64
C object
D datetime64[ns]
dtype: object
In [30]: df._get_numeric_data()
Out[30]:
A B
0 0 -0.667672
1 1 0.811300
2 2 2.020402
열에 있는 값 중 하나에 대해 유형을 확인하는 것이 어떻습니까?우리는 항상 다음과 같은 것을 가지고 있었습니다.
isinstance(x, (int, long, float, complex))
아래 데이터 프레임의 열에 대한 데이터 유형을 확인하려고 하면 예상되는 숫자 유형이 아닌 '개체'로 표시됩니다.
df = pd.DataFrame(columns=('time', 'test1', 'test2'))
for i in range(20):
df.loc[i] = [datetime.now() - timedelta(hours=i*1000),i*10,i*100]
df.dtypes
time datetime64[ns]
test1 object
test2 object
dtype: object
다음을 수행하면 정확한 결과를 얻을 수 있는 것 같습니다.
isinstance(df['test1'][len(df['test1'])-1], (int, long, float, complex))
돌아온다
True
다음을 시도할 수도 있습니다.
df_dtypes = np.array(df.dtypes)
df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]
부울 목록을 반환합니다.True
숫자인 경우,False
아니라면.
다른 모든 답변에 추가하기 위해 사용할 수도 있습니다.df.info()
각 열의 데이터 유형을 가져옵니다.
dtype을 사용하여 지정된 열에 숫자 값이 포함되어 있는지 여부를 확인할 수 있습니다.
numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']
참고: "O"는 대문자여야 합니다.
당신이 당신의 데이터를 같은 유형으로 유지하고 싶다고 가정했을 때, 저는 다음과 같은 작업을 발견했습니다.df._get_numeric_data()
:
df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1.0, 2.0, 3.0],
'C': [4.0, 'x2', 6], 'D': [np.nan]*3})
test_dtype_df = df.loc[:, df.apply(lambda s: s.dtype.kind in 'biufc')]
test_dtype_df.shape == df._get_numeric_data().shape
Out[1]: True
그러나 시리즈가 제대로 변환되는지 여부를 테스트하려면 "무시"를 사용할 수 있습니다.
df_ = df.copy().apply(pd.to_numeric, errors='ignore')
test_nmr_ignore = df_.loc[:, df_.apply(lambda s: s.dtype.kind in 'biufc')]
display(test_nmr_ignore)
test_nmr_ignore.shape == df._get_numeric_data().shape,\
test_nmr_ignore.shape == df_._get_numeric_data().shape,\
test_nmr_ignore.shape
B D
0 1.0 NaN
1 2.0 NaN
2 3.0 NaN
Out[2]: (True, True, (3, 2))
마지막으로, 일부 데이터가 혼합된 경우 사용할 수 있습니다.coerce
와 함께pd.to_numeric
함수를 선택한 다음 완전히 채워진 열을 삭제합니다.np.nan
가치.
df_ = df.copy().apply(pd.to_numeric, errors='coerce')
test_nmr_coerce = df_.dropna(axis=1, how='all')
display(test_nmr_coerce)
B C
0 1.0 4.0
1 2.0 NaN
2 3.0 6.0
다음 열을 결정해야 할 수도 있습니다.np.nan
정확성을 위해 원본 데이터의 값을 입력합니다.원본을 병합했습니다.np.nan
데이터로 합니다.df_
:
nacols = [c for c in df.columns if c not in df.dropna(axis=1, how='all').columns]
display(pd.merge(test_nmr_coerce,
df[nacols],
right_index=True, left_index=True))
B C D
0 1.0 4.0 NaN
1 2.0 NaN NaN
2 3.0 6.0 NaN
언급URL : https://stackoverflow.com/questions/19900202/how-to-determine-whether-a-column-variable-is-numeric-or-not-in-pandas-numpy
'programing' 카테고리의 다른 글
마운트된 수명 주기 후크의 비동기 대기 (0) | 2023.07.16 |
---|---|
두 판다 열 사이의 시간 차이(시간 및 분) 계산 (0) | 2023.07.16 |
그래프QL 큰 정수 오류:Int는 32비트 부호가 없는 정수 값을 나타낼 수 없습니다. (0) | 2023.07.16 |
파이썬에서 이미지의 exif 데이터를 읽으려면 어떻게 해야 합니까? (0) | 2023.07.16 |
Spring Boot이 application.yml config를 로드하지 않습니다. (0) | 2023.07.16 |