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

Pandas:调用函数生成多新变量时结果转置的问题解决

解决Pandas apply赋值多列时的转置问题

问题原因

你用df.apply(lambda x: Powers(x.x), axis=1)时,返回的是一个元素为列表的Series。当直接把这个Series赋值给多列时,Pandas会将每个列表的元素按列维度展开,最终导致行列转置的结果。而axis=0是逐列处理,此时x代表整列,没有x.x属性,自然报错;当DataFrame长度变化时,列表长度和列数不匹配也会触发错误。

解决方法

方法1:让apply返回Series而非列表

修改lambda表达式,将Powers的返回结果转为pd.Series,这样apply会直接生成对应列的DataFrame,赋值时就能正确匹配:

import pandas as pd

def Powers(x):
    return [x, x**2, x**3, x**4, x**5]

df = pd.DataFrame({'x':(1, 2, 3, 4, 5)})
# 修改apply逻辑,返回Series
df[['Exp_1', 'Exp_2', 'Exp_3', 'Exp_4', 'Exp_5']] = df.apply(lambda x: pd.Series(Powers(x.x)), axis=1)

方法2:用向量化运算替代apply(推荐)

apply是逐行循环,效率较低。直接利用Pandas的向量化特性计算各次幂,更高效且避免转置问题:

import pandas as pd

df = pd.DataFrame({'x':(1, 2, 3, 4, 5)})
# 直接生成各次幂列
for i in range(1, 6):
    df[f'Exp_{i}'] = df['x'] ** i

方法3:将apply结果转为DataFrame再合并

如果必须保留自定义Powers函数,可先将apply返回的列表转为DataFrame,再和原表合并:

import pandas as pd

def Powers(x):
    return [x, x**2, x**3, x**4, x**5]

df = pd.DataFrame({'x':(1, 2, 3, 4, 5)})
# 把apply结果转为DataFrame
exp_df = pd.DataFrame(df['x'].apply(Powers).tolist(), columns=['Exp_1', 'Exp_2', 'Exp_3', 'Exp_4', 'Exp_5'])
# 和原df合并
df = pd.concat([df, exp_df], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:15:50