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

如何在Pandas DataFrame切片中用apply批量设置多列值

解决pandas中apply返回元组赋值多列的问题

嘿,我来帮你搞定这个问题!你遇到的情况是因为pandas对apply返回的元组处理逻辑导致的:直接把返回元组的Series赋值给多列时,它不会自动拆分元组到对应列,反而会把整个元组作为值塞进每个单元格,所以才会出现两列都变成元组的情况。下面给你两种靠谱的解决方法:

方法一:将apply结果转换为可拆分的格式

你可以把apply返回的结果转换成列表或者DataFrame,让pandas能自动匹配列进行赋值:

方式1:用tolist()转换

修改赋值代码为:

df.loc[df['Alt']==0, ['Alt', 'AltType']] = df.loc[df['Alt']==0].apply(testapply, axis=1).tolist()

tolist()会把每个元组转换成列表,pandas就能识别出这是对应两列的值,自动拆分赋值。

方式2:转换为DataFrame

也可以把apply的结果转换成DataFrame,这样列名和目标列对应后直接赋值:

# 把apply返回的元组转换成DataFrame,自动生成0、1列
result_df = df.loc[df['Alt']==0].apply(testapply, axis=1).apply(pd.Series)
# 赋值给目标列
df.loc[df['Alt']==0, ['Alt', 'AltType']] = result_df

方法二:在apply函数内直接修改行数据

如果你更习惯在apply里直接操作行,可以修改函数逻辑,返回修改后的整行:

def testapply(row):
    # 只处理Alt为0的行
    if row['Alt'] == 0:
        try:
            match = re.findall("SFC-([0-9]+)FT (MSL|AGL|FL)", row.FreeText)[0]
            row['Alt'] = int(match[0])
            row['AltType'] = match[1]
        except IndexError:
            # 没匹配到的话保持原数据
            pass
    return row

# 对整个DataFrame应用函数
df = df.apply(testapply, axis=1)

这种方法不需要单独切片赋值,直接处理整行数据,逻辑更直观。

验证结果

执行完上面的任意一种方法后,你的DataFrame第三行数据会变成:

AltAltTypeFreeText
10000MSLxxxx SFC-10000ft MSLXXX

完全符合你的预期!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:07:30