【发布时间】: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