如何使用条件遍历列中的每个值并创建具有新值的新列

时间:2018-11-28 23:28:33

标签: python

我的数据框中有一个累积总和%列。 我想拥有一个遍历该列每个单元格并在新创建的列M_quintile中返回值的函数。

cumsum  cumsumperc  M_quintile
   465     0.001320   a number between 1-5    
   439     0.002499   a number between 1-5        
   213     0.003624   a number between 1-5        
   616     0.004583   a number between 1-5        
   527     0.005468   a number between 1-5   

这是我当前拥有的功能:

def score(x):
    if x <= 0.20:
        return 5
    elif x <= 0.40:
        return 4
    elif x <= 0.60:
        return 3
    elif x <= 0.80:
        return 2
    else:
        return 1 

如何在专门针对cumsumperc列的特定列上应用此功能?

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找pd.cut()。就您而言:

df['M_quintile'] = pd.cut(df.cumsumperc, bins=[-np.inf,0.2,0.4,0.6,0.8,np.inf], labels=[5,4,3,2,1])

>>> df
   cumsum  cumsumperc M_quintile
0     465    0.001320          5
1     439    0.002499          5
2     213    0.003624          5
3     616    0.004583          5
4     527    0.005468          5

这表示:如果cumsumperc在负无穷大和0.2之间(bins参数中的前两个值),则将其赋值为5(labels参数中的第一个值),如果介于0.2和0.4之间,则将其分配为4,依此类推,直到介于0.8和无穷大之间,则将其分配为1。

在您的情况下,所有值都在负无穷大和0.2之间,因此它们都被赋值为5。为说明起见,请看一下如果添加另一个值会发生什么情况:

>>> df
   cumsum  cumsumperc
0     465    0.001320
1     439    0.002499
2     213    0.003624
3     616    0.004583
4     527    0.005468
5     999    0.720000
>>> df['M_quintile'] = pd.cut(df.cumsumperc, bins=[-np.inf,0.2,0.4,0.6,0.8,np.inf], labels=[5,4,3,2,1])
>>> df
   cumsum  cumsumperc M_quintile
0     465    0.001320          5
1     439    0.002499          5
2     213    0.003624          5
3     616    0.004583          5
4     527    0.005468          5
5     999    0.720000          2

答案 1 :(得分:1)

我认为通过Pandas可以有更好的方法,但是如果您想使用自己的函数,可以使用apply函数。

import pandas as pd

def score(x):
    if x <= 0.20:
        return 5
    elif x <= 0.40:
        return 4
    elif x <= 0.60:
        return 3
    elif x <= 0.80:
        return 2
    else:
        return 1 

df['M_quintile'] = df['cumsumperc'].apply(score)

输出:

   cumsum  cumsumperc  M_quintile
0     465    0.001320           5
1     439    0.002499           5
2     213    0.003624           5
3     616    0.004583           5
4     527    0.005468           5