Python 循环浏览每一行并给客户打分

Python 循环浏览每一行并给客户打分,python,pandas,Python,Pandas,我正在尝试循环我的数据框架,并在Mbr grade列中为公司成员添加一个等级。一个条件是基于他们花费的金额,另一个是基于他们拥有的交易数量 def MbrGrade(): for index, row in MbrKPI.iterrows(): if MbrKPI['Amt']>500 & MbrKPI['Transaction No_']>10: MbrKPI['Mbr grade']='A' elif

我正在尝试循环我的数据框架,并在
Mbr grade
列中为公司成员添加一个等级。一个条件是基于他们花费的金额,另一个是基于他们拥有的交易数量

def MbrGrade():
    for index, row in MbrKPI.iterrows():    
        if MbrKPI['Amt']>500 & MbrKPI['Transaction No_']>10:
            MbrKPI['Mbr grade']='A'
        elif MbrKPI['Amt']>500 & MbrKPI['Transaction No_']<10:
            MbrKPI['Mbr grade']='B'
        elif MbrKPI['Amt']<500 & MbrKPI['Transaction No_']<10:
            MbrKPI['Mbr grade']='C'
    MbrGrade()
def MbrGrade():
对于索引,MbrKPI.iterrows()中的行:
如果MbrKPI['Amt']>500和MbrKPI['Transaction No']>10:
MbrKPI['Mbr等级']='A'

elif MbrKPI['Amt']>500&MbrKPI['Transaction No']使用
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


注意:
您没有地址
10
,所以我忽略了它。
你应该能够相应地适应。
注2:

另外,注意边缘情况
==500
==10
使用
np。其中

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


注意:
您没有地址
10
,所以我忽略了它。
你应该能够相应地适应。
注2:
另外,注意边缘情况
==500
==10

我认可并警告您的状况存在差距。
np.where
方法非常紧凑且矢量化良好

然而,这可能有点难理解为什么它对刚接触熊猫的人有效。下面是一种跟踪普通Python逻辑和表单的方法。它几乎没有很好的矢量化——但除非您有非常大的数据集,否则这可能不是问题

def决定等级(行):
金额,交易记录=第['amt']行,第['Transaction No']
如果金额>500且交易记录>10:返回“A”
如果金额>500且变速箱<10:返回“B”
如果金额<500且变速箱<10:返回“C”
返回'???'
MbrKPI['Grade']=MbrKPI.apply(决定等级,轴=1)
它使用一个决策函数,
decise_grade
,将决定一个等级的逻辑与索引和行创建代码分开。
axis=1
表示所应用的函数依次获取数据帧的每一行(默认值为
axis=0
,依次传递每一列)。然后,决策函数将行值“分解”为两个标量变量,以便以最简单、最清晰的方式陈述其决策逻辑

对于较大的数据集,结果如下:

无论您选择哪条路径,请注意,“行循环”如果没有错的话,也不是熊猫习语。应用决策函数,以向量形式计算新列是更新数据帧的性能更好、更惯用的方法。与传统循环相比,它们更接近数据库查询/数据操作语句。

我赞同并警告您的条件中存在的差距。
np.where
方法非常紧凑且矢量化良好

然而,这可能有点难理解为什么它对刚接触熊猫的人有效。下面是一种跟踪普通Python逻辑和表单的方法。它几乎没有很好的矢量化——但除非您有非常大的数据集,否则这可能不是问题

def决定等级(行):
金额,交易记录=第['amt']行,第['Transaction No']
如果金额>500且交易记录>10:返回“A”
如果金额>500且变速箱<10:返回“B”
如果金额<500且变速箱<10:返回“C”
返回'???'
MbrKPI['Grade']=MbrKPI.apply(决定等级,轴=1)
它使用一个决策函数,
decise_grade
,将决定一个等级的逻辑与索引和行创建代码分开。
axis=1
表示所应用的函数依次获取数据帧的每一行(默认值为
axis=0
,依次传递每一列)。然后,决策函数将行值“分解”为两个标量变量,以便以最简单、最清晰的方式陈述其决策逻辑

对于较大的数据集,结果如下:


无论您选择哪条路径,请注意,“行循环”如果没有错的话,也不是熊猫习语。应用决策函数,以向量形式计算新列是更新数据帧的性能更好、更惯用的方法。与传统循环相比,它们更接近数据库查询/数据操作语句。

谢谢!帮助我更好地理解函数的用法谢谢!帮助我更好地理解函数的使用