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

如何在Pandas中结合条件函数使用.apply(func)?报错求助

问题描述

我有如下Pandas DataFrame:

count   area    volume      formula     quantity
0   1.0     22       NaN       count         1.0
1   1.0     15       NaN       count         1.0
2   1.0     1.4      NaN       area          1.4
3   1.0     0.6       10       volume        100

quantity列是通过formula列的值查找对应列得到的:比如第0行formula为"count",则quantity取count列的1.0;第2行formula为"area",则取area列的1.4。

原本用这段代码实现:

Merged['quantity']=Merged.apply(lambda x: x[x['QuantityFormula']] , axis=1)

但volume对应的quantity需要计算为volume*10,于是写了如下函数处理两种情况:

def func(x):
    if x[x['QuantityFormula']] == Volume:
        return volume * 10
    else:
        return x[x['QuantityFormula']]
   

df['Classification'] = Merged['QuantityFormula'].apply(func)

运行后报错:

Error: string indices must be integers
错误原因
  1. 你调用apply时用了Merged['QuantityFormula'].apply(func),此时func接收的参数x是QuantityFormula列的单个字符串值(比如"count"、"volume"),而非整行数据。所以x[x['QuantityFormula']]相当于用字符串索引字符串,必然触发"string indices must be integers"错误。
  2. 代码中Volume是未定义的变量,应改为字符串常量"volume";volume * 10里的volume也未定义,需从行数据中取对应列的值。
解决方法

方法一:修正apply调用方式与函数逻辑

对整个DataFrame调用apply并指定axis=1,让函数接收整行数据,同时修正变量名问题:

def func(row):
    # 确保列名与你的DataFrame一致,此处用formula匹配示例DataFrame的列名
    formula = row['formula']
    if formula == 'volume':
        return row['volume'] * 10
    else:
        return row[formula]

# 按行应用函数,生成quantity列
df['quantity'] = df.apply(func, axis=1)

方法二:用numpy.where批量处理(效率更高)

适合大数据量场景,利用np.where做条件判断,结合df.lookup批量取值:

import numpy as np

df['quantity'] = np.where(
    df['formula'] == 'volume',
    df['volume'] * 10,
    df.lookup(df.index, df['formula'])
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:20:54