【发布时间】:2020-09-28 22:26:29
【问题描述】:
首先,我使用 pandas 函数 pd.read_sql() 创建一个数据集。据我所知,所有导入的列都是字符串。
然后我创建一个新的空变量并定义一个函数,就像这样(tinyurl.com/tnr9b83):
df['status_update'] = ""
def f(row):
if (row['priority'] in ("1","2")) and (row['failed'] == "Y"):
val = "F"
elif (row['priority'] in ("1","2")):
val = row['status'].str.slice(0,1)
else:
val = "X"
return val
然后我尝试更改数据集的每一行,以便:
- 如果一条记录在 ("1","2") 中具有优先级并且失败 = "Y",它将获得 status_update = "F"
- 否则,如果记录在 ("1","2") 中具有优先级,它将获得 status_update = 列“状态”的第一个字母子字符串
- 否则它会得到 status_update = "X"
所以我跑了:
df['status_update'] = df.apply(f, axis=1)
..但这给出了:
AttributeError: 'str' object has no attribute 'str'
我尝试了替代语法但无济于事。其他报告此错误的人似乎有不同的情况和解决方案。作为一个新的 Python 程序员,了解为什么这种语法/逻辑在这种情况下不起作用的最佳第一步/工具/功能是什么?
编辑:澄清:错误与“val = row['status'].str.slice(0,1)”有关 Edit2:值得注意的是,当我打开数据查看器时,它有类似 []...[]...[] 的东西,而不是新的“status_update”字段中许多观察的单个字符值,所以我猜返回某种数组或向量,而不是单个子字符串。
【问题讨论】:
-
什么是
row?它是数据框行对象,还是普通字典?尝试将print(type(row))放在函数顶部。 -
'row' 是数据框行对象的占位符,我相信。我添加了您的建议,但没有看到要分享的相关输出。该脚本的目的是根据提供的条件更改所有行的“status_update”列的值。语法从这里的最佳答案中提取:tinyurl.com/tnr9b83
-
错误提示
row['status']已经是str。什么样的对象有str属性?在 Python 中,每类对象都有记录的属性和方法。如果你的类错了,或者属性错了,你就会得到这种错误。这不是语法问题。您需要将对象与其正确的属性相匹配。 -
谢谢,hpaulj。我不确定这是否是一个反问,但我猜 str 对象具有 str 属性,所以,正如你所说, row['status'] 已经是一个 str。但如果这是真的,为什么不将其更改为
row['status'].slice(0,1)工作,正如 Gels_YT 建议的那样?