【问题标题】:Function to check if object-dtype column value is float or string检查 object-dtype 列值是浮点数还是字符串的函数
【发布时间】:2018-11-21 18:26:09
【问题描述】:

我正在尝试在excel中编写一个等于isnumber[column]函数的函数

数据集:

feature1 feature2 feature3
  123       1.07     1
  231       2.08     3
  122        ab      4
  111       3.04     6
  555        cde     8

feature1: integer dtype
feature2: object dtype
feature3: integer dtype

我试过这段代码

for item in df.feature2.iteritems():
    if isinstance(item, float):
       print('yes')
    else:
       print('no')

我得到的结果是

 no
 no
 no
 no
 no

但我希望结果为

yes
yes
no
yes
no

当我尝试检查单个 feature2 值的类型时,这就是所看到的

type(df.feature2[0]) = str
type(df.feature2[1]) = str
type(df.feature2[2]) = str
type(df.feature2[3]) = str
type(df.feature2[4]) = str

But clearly 0,1,3 should be shown as float, but they show up as str

我做错了什么?

【问题讨论】:

    标签: python python-3.x python-2.7 user-defined-types isinstance


    【解决方案1】:

    Iteritems 返回一个元组,((123, '1.07'), 1.07),由于您想遍历每个值,请尝试以下代码。 您只需删除.iteritems(),它就会像魅力一样发挥作用。

    df['feature2']=[1.07,2.08,'ab',3.04,'cde']
    for item in df.feature2:
        if isinstance(item,float):
           print('yes')
        else:
           print('no')
    

    这是你的输出:

    yes
    yes
    no
    yes
    no
    

    【讨论】:

    • 如果有帮助,请注意接受并支持答案。谢谢:)
    • @SaiSumanth 你能告诉我有什么错误吗?我包括了我用于测试的数据框创建行,它对我有用。另外,我正在使用 Python3
    • 它现在可以工作了,实际上我的特征值是'float string'类型而不是float类型。谢谢
    【解决方案2】:

    我认为您需要在这里考虑两件事:

    1. DictDataFrame 的方法
    2. dtype(数组标量类型)和类型(内置 Python 类型)之间的区别 - 参考 (https://numpy.org/devdocs/reference/arrays.dtypes.html)

    第 1 点:

    .iteritems() / .items() 是字典的方法,而如果您正在处理 dtypes(并根据您提供的数据判断),您可能会通过一个 DataFrame,在其中您不不需要使用.iteritems() 方法来循环遍历每个值。旁注,.iteritems() 已被 Python 淘汰,取而代之的是 .items()(参见讨论:When should iteritems() be used instead of items()?

    第 2 点:

    使用 numpy 或 Pandas 时,导入 DataFrames 的值的数据类型称为dtypes。这些需要与它们在 Python 中的直接比较区分开来,Python 将其称为 type。您应该使用“Pandas 数据类型”标题下的表格将dtype 映射到type(参考:https://pbpython.com/pandas_dtypes.html

    现在,针对您的问题,这段代码应该可以解决您的问题:

    import pandas as pd
    
    columns = ['feature1', 'feature2', 'feature3']
    data = [[123, 1.07, 1],
            [231, 2.08, 3],
            [122, 'ab', 4],
            [111, 3.04, 6],
            [555, 'cde', 8]]
    
    df = pd.DataFrame(data, columns=columns)
    
    for value in df.feature2:
        if isinstance(value,float):
            print('yes')
        else:
            print('no')
    

    【讨论】:

      【解决方案3】:

      试试这个:

      for i in range(len(df["feature2"])):
          test = df.loc[i,"feature2"]
          if isinstance(test, float):
              print('yes')
          else:
              print('no')
      

      【讨论】:

      • 请记住,这只是测试浮点数 - 如果您想要任何数字、浮点数或整数,则必须将第三行更改为 if isinstance(test, float) 或 isinstance(test, int):
      【解决方案4】:

      这是因为iteritems() 返回一个元组,即(index, value)。 因此,您正在尝试检查 (0, 1.07)(1, 2.08) 是否属于浮点类型,当然它们不是。

      如果您将df.feature2.iteritems() 更改为df.feature2.values,它应该可以工作:)

      【讨论】:

        【解决方案5】:

        你可以这样做:

        from pandas import DataFrame as df
        
        columns = ['feature1', 'feature2', 'feature3']
        data = [[123, 1.07, 1],
         [231, 2.08, 3],
         [122, 'ab', 4],
         [111, 3.04, 6],
         [555, 'cde', 8]]
        
        df_ = df(data, columns=columns)
        types = []
        for k in df_:
            a = set(type(m) for m in df_[k])
            if len(a) > 1:
                types.append({k: 'object'})
            else:
                types.append({k: str(list(a)[0].__name__)})
        
        print(types)
        

        输出:

        [{'feature1': 'int'}, {'feature2': 'object'}, {'feature3': 'int'}]
        

        【讨论】:

          猜你喜欢
          • 2018-03-20
          • 2022-01-10
          • 2019-10-05
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          相关资源
          最近更新 更多