Python:检查dataframe列是否包含string typ

2024-05-14 20:09:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想检查数据框中的列是否由字符串组成,这样我就可以用数字标记它们,以便于机器学习。有些列由数字组成,我不想更改它们。列示例如下:

TRAIN FEATURES
  Age              Level  
  32.0              Silver      
  61.0              Silver  
  66.0              Silver      
  36.0              Gold      
  20.0              Silver     
  29.0              Silver     
  46.0              Silver  
  27.0              Silver      

谢谢你=)


Tags: 字符串标记机器agesilvertrain数字level
3条回答

注意,上面的答案将包括DateTime、TimeStamp、Category和其他数据类型。

使用object更具限制性(尽管我不确定其他dtypes是否也属于object类型):

  1. 创建数据帧:

    df = pd.DataFrame({
        'a': ['a','b','c','d'], 
        'b': [1, 'b', 'c', 2], 
        'c': [np.nan, 2, 3, 4], 
        'd': ['A', 'B', 'B', 'A'], 
        'e': pd.to_datetime('today')})
    df['d'] = df['d'].astype('category')
    

会是这样的:

   a  b    c  d          e
0  a  1  NaN  A 2018-05-17
1  b  b  2.0  B 2018-05-17
2  c  c  3.0  B 2018-05-17
3  d  2  4.0  A 2018-05-17
  1. 您可以检查调用dtypes的类型:

    df.dtypes
    
    a            object
    b            object
    c           float64
    d          category
    e    datetime64[ns]
    dtype: object
    
  2. 可以使用items()方法列出字符串列,并通过object进行筛选:

    > [ col  for col, dt in df.dtypes.items() if dt == object]
    ['a', 'b']
    
  3. 或者,您可以使用“选择数据类型”来显示仅包含以下字符串的数据帧:

    df.select_dtypes(include=[object])
       a  b
    0  a  1
    1  b  b
    2  c  c
    3  d  2
    

是的,有可能。你用^{}

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': ['a','b','c','d']})
if df['a'].dtype != np.number:
    print('yes')
else:
    print('no')

也可以使用^{}按数据类型选择列

df_subset = df.select_dtypes(exclude=[np.number])
# Now apply you can label encode your df_subset

扩展到Scratch'N'Purr的答案:

>>> df = pd.DataFrame({'a': ['a','b','c','d'], 'b': [1, 'b', 'c', 2], 'c': [np.nan, 2, 3, 4]})
>>> df 
   a  b    c
0  a  1  NaN
1  b  b  2.0
2  c  c  3.0
3  d  2  4.0

>>> dict(filter(lambda x: x[1] != np.number, list(zip(df.columns, df.dtypes))))
{'a': dtype('O'), 'b': dtype('O')}

所以我添加了一些混合类型的列。您可以看到,filter+dict方法生成key:value映射,其中列的数据类型超出了np.number的界限。这在规模上应该很管用。您还可以尝试将每个列强制为特定类型(例如int),然后在无法将字符串列转换为int时捕获ValueError异常。有很多方法可以做到这一点。

相关问题 更多 >

    热门问题