【问题标题】:Error 'float' object has no attribute 'encode' when using apply(unidecode) to a dataframe's column of str使用 apply(unidecode) 到数据框的 str 列时,错误“float”对象没有属性“encode”
【发布时间】:2020-02-22 07:16:57
【问题描述】:

我正在尝试使用 for 循环从数据框的列中删除重音符号,但我不断收到错误消息“float object has no attribute encode”并且它是一个 str 列。最有趣的是,我在代码的两点应用了这个循环,它只在第二点识别错误。

df_ = df_target.copy()

for col in df_:
    if col == 'estado' or col == 'cidade' and (df_[col] is not None and isinstance(df_[col], str)):
        print(df_[col].head(100))
        df_[col] = df_[col].apply(unidecode)

df_target 是一个 pandas 数据框,在这一步之前,它从一个 CSV 文件中接收数据

col 从数据框中读取列的名称

df_[col] 应该读取名为 estado(州)和 cidade(城市)的列中的所有元素

我只想从这两列中删除所有重音符号。

如果有人也可以帮助我在列表理解中编写这个 for 循环会很棒,我试过但没有奏效。这个切片在一个类中,我希望尽可能保持最干净和最简单。

【问题讨论】:

  • 不知道df_target 是什么形状/类型(我假设它是字符串值的可迭代)并且没有实际尝试代码:df_ = [col.apply(unicode) for col in df_target if col == 'estado' or col == 'cidade']。不需要其他测试,我想。但是这种理解可能无法解决您提到的错误,并且它的操作更像是一个过滤器,而不是您的代码的实际复制和修改。
  • Pandas 没有str 列,是吗?一列,一个熊猫系列,可能有一个对象 dtype,并包含 Python 字符串元素。错误发生在哪里?在unidecode 行中?难道该列也有数字?如果 object dtype 它可以包含各种项目,字符串,None 或浮点数。
  • 对不起@Jens,我将编辑我的问题以使其更清楚。 dt_target 是一个 pandas 数据框,此变量读取一个 CSV 文件,其中包含一列州、城市、国家和其他关于页面可视化的列。我正在尝试从 state 列和 city 列中删除重音,因为我有另一个数据集在此类数据中没有重音,我需要将两者交叉关联。我会试试这个理解!
  • @hpaulj 我正在使用的这个数据集很大,我不知道除了州名或城市名之外是否还有其他信息,我想可以退出一些浮动数据,但我希望过滤它与 isinstance() 一起使用。我在 jupyter notebook 中执行了完全相同的循环,并且效果很好,但是当我将它传递给 oop 代码时,我得到了这个错误。
  • 如果 col 名称正确,isinstance 测试不会执行任何操作。

标签: python python-3.x pandas oop encode


【解决方案1】:

这可能是因为运算符优先级。 or 的优先级高于 and

所以在表达式中加上括号可能会有所帮助。

if (col == 'estado' or col == 'cidade') and (df_[col] is not None and isinstance(df_[col], str)):

其次。而不是 for 循环。定义谓词并将谓词传递给apply函数

def pred(x):
    # code

df_.apply(pred, axis=1)

【讨论】:

  • 我已经尝试在表达式中添加括号但没有解决我的问题,我会尝试第二个并让您知道这是否有效。 :)
【解决方案2】:

为了记录,我解决了我的问题“强制”我的所有系列元素到 str。

        for col in df_target:
        if col == 'estado' or col == 'cidade':
            df_target[col] = df_target[col].astype(str)
            df_target[col] = df_target[col].apply(unidecode)

我认为这不是更聪明的解决方案,但我很苦恼,我选择了这个解决方案,因为我的截止日期很短。

感谢所有帮助的人!

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 2015-03-28
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多