Python中Plotnine函数传递DataFrame与变量的可行性咨询
当然可行!帮你修正代码里的小问题
作为Python新手,你这个思路完全没问题——把DataFrame和变量名传入函数来复用绘图逻辑是非常好的实践!不过你的代码里有两个关键问题需要调整,我来帮你改好:
问题1:DataFrame列访问方式错误
你写的dataset.variableName会让Python把variableName当成DataFrame的列名,而不是你传入的参数值。正确的做法是用方括号索引:dataset[variableName]。
问题2:plotnine的aes映射需要解析变量名
plotnine的aes()函数默认会把传入的参数当成字面量字符串,不会识别你传入的变量名。这里有两种解决方法:
- 方法一:使用
aes_string(),专门接收字符串形式的列名 - 方法二:使用tidyeval语法,用
!!sym()把字符串转成plotnine能识别的符号
下面是修正后的完整代码:
方法一:用aes_string()的版本
from plotnine import ggplot, aes_string, geom_boxplot, labs, ggtitle def countPred_eda(dataset, variableName, targetVariable): # 正确访问列并打印描述性统计 print(dataset[variableName].describe()) # 使用aes_string接收字符串列名 return (ggplot(dataset) + aes_string(x=targetVariable, y=variableName, fill=targetVariable) + geom_boxplot(alpha=0.8) + labs(x=targetVariable, y=variableName) + ggtitle(f"Churn ratio with {variableName}")) # 调用时要把变量名传成字符串! countPred_eda(train_data, "number_customer_service_calls", "churn")
方法二:用tidyeval语法的版本(更推荐,符合现代plotnine用法)
from plotnine import ggplot, aes, geom_boxplot, labs, ggtitle from rlang import sym, !! def countPred_eda(dataset, variableName, targetVariable): print(dataset[variableName].describe()) # 把字符串转成符号,用!!注入到aes里 var_sym = sym(variableName) target_sym = sym(targetVariable) return (ggplot(dataset) + aes(x=!!target_sym, y=!!var_sym, fill=!!target_sym) + geom_boxplot(alpha=0.8) + labs(x=targetVariable, y=variableName) + ggtitle(f"Churn ratio with {variableName}")) # 同样要传字符串形式的列名 countPred_eda(train_data, "number_customer_service_calls", "churn")
关键提醒
调用函数的时候,一定要把列名以字符串的形式传入(比如"number_customer_service_calls"而不是直接写number_customer_service_calls),否则Python会把它当成未定义的变量报错!
这样修改后,你的函数就能正常接收DataFrame和变量名,绘制出想要的箱线图啦~
内容的提问来源于stack exchange,提问作者Rohit Haritash
相关产品推荐
相关产品推荐

