【问题标题】:'DataFrame' object has no attribute 'str' [duplicate]“DataFrame”对象没有属性“str”[重复]
【发布时间】:2021-11-01 08:20:01
【问题描述】:

我已经定义了下面的函数

#defining the functions:
def make_lower(df,column_name):
    for i in column_name:
        df[column_name] = df[column_name].str.lower()
    return df

但是在尝试将函数添加到管道时

df_processed = (train_data.
                pipe(make_lower,["teacher_prefix"])
)

我收到以下错误

AttributeError: 'DataFrame' object has no attribute 'str'

【问题讨论】:

  • 正是错误所说的:DataFrame 类对象没有属性 str。如果你需要让一个字符串更低,你的列表应该由字符串组成,你应该只使用方法 .lower()
  • 应该是df[i] = df[i].str.lower()。 column_name 是 list 使 df[column_name] ==> df[["teacher_prefix"]] 成为 DataFrame 而不是 Series。您知道这一点并迭代列表for i in column_name 中的每个值,但随后不要使用迭代器生成的值。顺便说一句,for col in column_names 可能会让发生的事情更清楚。
  • 感谢@HenryEcker 这行得通,df[i] = df[i].apply(lambda x: x.str.lower()) 也行。
  • 不客气。如果您使用 apply 它应该是 df[column_names] = df[column_names].apply(lambda x: x.str.lower()) 没有循环。 (因为 apply 已经是一个循环了)
  • 按照副本,除了使用.lower

标签: python pandas dataframe


【解决方案1】:

对不起,我误解了任务。行错误

df[column_name] = df[column_name].str.lower()

应该是

    for i in column_name:
        df[i] = df[i].str.lower()

因为您正在迭代“column_name”

【讨论】:

  • 这会使列名变小。然后立即丢弃修改后的列名,因为它没有在任何地方使用并且lower 不是对字符串的可变操作。
  • 对不起,我误解了任务。 df[column_name] = df[column_name].str.lower() 行中的错误,应该是 df[i].str.lower(),因为您正在迭代“column_name”
  • 如果您想更改答案,请在答案本身中进行,而不是在 cmets 中进行。
猜你喜欢
  • 2021-11-19
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多