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

如何在Pandas中链式调用df.col.str.split()?(melt后场景)

Pandas链式调用中拆分列的正确姿势

你遇到的问题核心是:在链式操作里直接用df.fy会引用原数据框,而非melt之后的结果。要在链式中调用str.split(expand=True),可以用以下两种方法:

方法一:assign结合lambda函数

利用assign支持lambda函数的特性,lambda的参数就是当前链式步骤中的DataFrame,这样就能正确访问melt生成的fy列:

df = pd.DataFrame().from_dict({
    'id' : [1,2,3,4],
    '2022_amt' : [10.1,20.2,30.3, 40.4],
    '2022_qty' : [10,20,30,40]
})

df = ( 
    df
    .melt(
         id_vars=['id'], 
         value_vars=['2022_amt', '2022_qty'], 
         var_name='fy', 
         value_name='num' 
    )
    .assign(
        year=lambda x: x['fy'].str.split('_', expand=True)[0],
        t=lambda x: x['fy'].str.split('_', expand=True)[1]
    )
    .drop(columns=['fy'])
)

这里lambda x里的x就是melt处理后的DataFrame,完全不会和外部的原df混淆。

方法二:用pipe封装拆分逻辑

如果拆分逻辑比较复杂(比如需要重命名拆分后的列),用pipe把操作封装成函数,链式调用会更清晰:

def split_and_merge_fy(df):
    # 拆分fy列并指定列名
    split_result = df['fy'].str.split('_', expand=True)
    split_result.columns = ['year', 't']
    # 合并拆分结果并删除原fy列
    return df.join(split_result).drop(columns=['fy'])

df = ( 
    df
    .melt(
         id_vars=['id'], 
         value_vars=['2022_amt', '2022_qty'], 
         var_name='fy', 
         value_name='num' 
    )
    .pipe(split_and_merge_fy)
)

这种方式把拆分、合并的逻辑单独抽离,代码可读性更好,后续修改也更方便。

内容的提问来源于stack exchange,提问作者manny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:30:46