使用dfply mutate+自定义函数返回内存地址而非值,如何解决?
问题描述
我尝试用dfply替代Pandas的apply和applymap方法,测试数据如下:
import pandas as pd from dfply import * df = pd.DataFrame({'country':['taiwan','ireland','taiwan', 'ireland', 'china'], 'num':[10.00, 10.50, 33.99, 10.50, 300], 'score':[1, 1, 3, 5, 10]})
对应的DataFrame输出:
country num score 0 taiwan 10.00 1 1 ireland 10.50 1 2 taiwan 33.99 3 3 ireland 10.50 5 4 china 300.00 10
为了实现自定义映射来替代.map,我编写了如下代码:
@pipe def update_country(country): if country == 'taiwan': return 'Republic of Taiwan' else: return country df >> mutate(new_country=update_country(X.country)) >> select(X.new_country)
但运行后得到的是内存地址而非预期的字符串:
new_country 0 <dfply.base.pipe object at 0x000001CAECD9B4F0> 1 <dfply.base.pipe object at 0x000001CAECD9B4F0> 2 <dfply.base.pipe object at 0x000001CAECD9B4F0> 3 <dfply.base.pipe object at 0x000001CAECD9B4F0> 4 <dfply.base.pipe object at 0x000001CAECD9B4F0>
想确认是不是用错了装饰器,以及有没有无需自定义函数的实现方式。
解决方案
1. 修正装饰器使用错误
@pipe装饰器是用于给DataFrame的管道操作流程做装饰的,不适合用来处理单个列的映射逻辑。要让普通函数能处理dfply的符号对象(比如X.country),应该使用@make_symbolic装饰器:
from dfply import make_symbolic @make_symbolic def update_country(country): if country == 'taiwan': return 'Republic of Taiwan' else: return country result = df >> mutate(new_country=update_country(X.country)) >> select(X.new_country) print(result)
运行后得到预期输出:
new_country 0 Republic of Taiwan 1 ireland 2 Republic of Taiwan 3 ireland 4 china
2. 无需自定义函数的实现方式
可以直接用dfply提供的case_when函数实现条件映射,不用单独定义函数:
result = df >> mutate( new_country=case_when( X.country == 'taiwan', 'Republic of Taiwan', default=X.country ) ) >> select(X.new_country) print(result)
这段代码同样会生成符合预期的结果。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

