如何在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
错误原因
- 你调用
apply时用了Merged['QuantityFormula'].apply(func),此时func接收的参数x是QuantityFormula列的单个字符串值(比如"count"、"volume"),而非整行数据。所以x[x['QuantityFormula']]相当于用字符串索引字符串,必然触发"string indices must be integers"错误。 - 代码中
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
相关产品推荐
相关产品推荐

