【发布时间】:2017-02-11 11:52:33
【问题描述】:
我很难理解df.apply()究竟是如何工作的。
我的问题如下:我有一个数据框df。现在我想在几列中搜索某些字符串。如果在任何列中找到该字符串,我想为找到该字符串的每一行添加一个“标签”(在新列中)。
我可以用map 和applymap 解决这个问题(见下文)。
但是,我希望更好的解决方案是使用 apply,因为它将函数应用于整个列。
问题:这不能使用apply 吗?我的错误在哪里?
这是我使用map 和applymap 的解决方案。
df = pd.DataFrame([list("ABCDZ"),list("EAGHY"), list("IJKLA")], columns = ["h1","h2","h3","h4", "h5"])
使用map的解决方案
def setlabel_func(column):
return df[column].str.contains("A")
mask = sum(map(setlabel_func, ["h1","h5"]))
df.ix[mask==1,"New Column"] = "Label"
使用applymap的解决方案
mask = df[["h1","h5"]].applymap(lambda el: True if re.match("A",el) else False).T.any()
df.ix[mask == True, "New Column"] = "Label"
对于apply我不知道如何将两列传递给函数/或者根本不了解机制;-)
def setlabel_func(column):
return df[column].str.contains("A")
df.apply(setlabel_func(["h1","h5"]),axis = 1)
上面给了我警报。
'DataFrame' 对象没有属性 'str'
有什么建议吗?请注意,我的实际应用程序中的搜索功能更复杂,需要一个正则表达式函数,这就是我首先使用.str.contain 的原因。
【问题讨论】:
-
你的预期输出是什么?
-
您好约翰,感谢您的回复。我的预期输出是
map和applymap返回的解决方案。对不起,我不知道如何在这里粘贴我的输出?你是怎么做到的?