Pandas报错:无法将多列DataFrame赋值给单列total_servings
解决Pandas创建新列时的赋值错误
错误原因分析
你遇到的Cannot set a DataFrame with multiple columns to the single column total_servings错误,本质是试图将多列结构赋值给单个列。虽然你的calculate函数逻辑上返回单个值,但通过apply处理时,因列切片结合apply的不必要使用,触发了结构不匹配的问题。
修复方案
方案1:用内置sum方法(推荐,性能最优)
Pandas支持对指定列直接按行求和,无需自定义函数和apply,代码简洁且效率更高:
import pandas as pd drinks = pd.read_csv('drinks.csv') # 直接对目标列按行求和创建新列 drinks['total_servings'] = drinks.loc[:, 'beer_servings':'wine_servings'].sum(axis=1) # 简化后续sales列的赋值(无需apply) drinks['beer_sales'] = drinks['beer_servings'] * 2 drinks['spirit_sales'] = drinks['spirit_servings'] * 4 drinks['wine_sales'] = drinks['wine_servings'] * 6 print(drinks)
方案2:修复自定义函数的apply调用(若需保留自定义逻辑)
如果后续要扩展复杂计算逻辑,可修改函数参数名避免与DataFrame变量冲突,确保返回单个值:
import pandas as pd drinks = pd.read_csv('drinks.csv') # 修改参数名避免变量名冲突,明确接收每行数据 def calculate(row): return row['beer_servings'] + row['spirit_servings'] + row['wine_servings'] # 直接对整个DataFrame调用apply,返回的Series可直接赋值给新列 drinks['total_servings'] = drinks.apply(calculate, axis=1) drinks['beer_sales'] = drinks['beer_servings'].apply(lambda x: x*2) drinks['spirit_sales'] = drinks['spirit_servings'].apply(lambda x: x*4) drinks['wine_sales'] = drinks['wine_servings'].apply(lambda x: x*6) print(drinks)
额外优化提示
- 优先使用Pandas内置的向量运算替代
apply:向量运算基于C实现,比逐行处理的apply效率高得多,尤其处理大数据集时差距明显。 - 类似
beer_sales的列赋值,直接用列乘法drinks['beer_sales'] = drinks['beer_servings'] * 2即可,无需lambda和apply。
内容的提问来源于stack exchange,提问作者Bhargavi
相关产品推荐
相关产品推荐

