循环遍历每一行并为客户评分

时间:2016-12-15 22:50:32

标签: python pandas

我正在尝试遍历我的数据框,并在exec列中向公司成员添加成绩。一个条件基于它们花费的金额,另一个条件基于它们拥有的交易数量。

Mbr grade

当我运行上述功能时,它给出了以下错误:

  

ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

2 个答案:

答案 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

enter image description here

<强> 注意:
你没有解决<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成语。应用决策函数,以向量形式计算新列是更好的性能和更惯用的方式来更新数据帧。与传统循环相比,它们更接近数据库查询/数据操作语句。