我正在尝试遍历我的数据框,并在exec
列中向公司成员添加成绩。一个条件基于它们花费的金额,另一个条件基于它们拥有的交易数量。
Mbr grade
当我运行上述功能时,它给出了以下错误:
ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
答案 0 :(得分:3)
使用np.where
MbrKPI = pd.DataFrame([
[501, 11],
[501, 9],
[499, 9]
], columns=['Amt', 'Transaction No_'])
a = MbrKPI['Amt'].values
t = MbrKPI['Transaction No_'].values
MbrKPI['MbrGrade'] = np.where(a > 500, np.where(t > 10, 'A', 'B'), 'C')
MbrKPI
<强> 注意:的强>
你没有解决<500 & >10
,所以我忽略了它
你应该能够相应地适应
的 注2: 强>
另外,请处理边缘案例==500
和==10
答案 1 :(得分:1)
我支持piRSquared's answer并警告你的情况有差距。 np.where
方法非常紧凑且矢量化良好。
然而,对于大熊猫新手来说,它可能有点难以理解。所以这是一种跟踪普通Python逻辑和表单的方法。它的矢量化程度不是很好 - 但除非你有非常大的数据集,否则这可能不是问题。
def decide_grade(row):
amt, trans = row['Amt'], row['Transaction No_']
if amt > 500 and trans > 10: return 'A'
if amt > 500 and trans < 10: return 'B'
if amt < 500 and trans < 10: return 'C'
return '???'
MbrKPI['Grade'] = MbrKPI.apply(decide_grade, axis=1)
它使用决策函数decide_grade
将决定等级的逻辑与索引和行创建代码分开。 axis=1
表示正在应用的函数依次获取DataFrame
的每一行(默认值axis=0
依次传递每列)。然后,决策函数将行值“解构”为两个标量变量,以便可以以最简单,最清晰的方式陈述其决策逻辑。
使用更大的数据集,结果:
无论你选择哪种方式,请注意“循环遍历”,如果没有错,则不是Pandas成语。应用决策函数,以向量形式计算新列是更好的性能和更惯用的方式来更新数据帧。与传统循环相比,它们更接近数据库查询/数据操作语句。