programing

Pandas/NumPy에서 열/변수가 숫자인지 여부를 확인하는 방법은 무엇입니까?

bestprogram 2023. 7. 16. 13:45

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쿨,iint(서명됨),u서명되지 않은 int,f흘러가다,c복잡한.https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind 을 참조하십시오.

판다들은 가지고 있습니다.select_dtype기능.다음과 같이 int64float64에서 열을 쉽게 필터링할 수 있습니다.

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