You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:54:03