在pandas中为列应用if语句

时间:2015-03-22 23:53:08

标签: python if-statement pandas

我有一个概率列,其中一些值大于1。 我试图遍历该列的每一行,并将值更改为0.99为所有> 0.99。此外,我需要查看列1是否等于第2列。如果是,概率必须为0.如果第3列大于11 =>将概率设为0。

我尝试了下一步,但这些都行不通。所有这些都告诉我我的语法无效:

test['Probability'] = test.apply(lambda r: '0.99' if r['Probability] == '0.99')

我也尝试写下一个。它不起作用:

test['Probability'] = ['0.99' if a > '0.99',
                       '0.0' if b == c,
                       '0.0' if d > '11'
                        for a, b, c, d in zip(
                          list(test['Probability']),
                          list(test['Column 1']),
                          list(test['Column 2']),
                          list(test['Column 3'])
                        )]


 Probability  Column 1   Column 2  Column 3
    1.13         2           2        13
    0            34          12       2 
    0.1042       4           4        5
    0.8          1           54       3
    0.03         1           3        8

感谢大家的帮助。

2 个答案:

答案 0 :(得分:3)

您可以编写简单的语句,如下所示。希望这有帮助!

    import pandas as pd
    import numpy as np
    df =   pd.DataFrame({'a':np.random.randn(10),'b':np.random.randn(10),'c':np.random.randn(10),'probability':np.random.randn(10)})
    df.b[0:4]=df.a[0:4]
    df.probability[2:7]=1
    df.c[8:10]=12

    #Set probability=0 where probability >0
    df['probability'][df['probability'] > 0.99] = 0.99

    #Set probability=0 where  column a = column b
    df['probability'] [df['a']==df['b']] = 0

    #Set probability=0 where  column c > 11
    df['probability'] [df['c']>11] = 0

    print df

      a         b          c            probability
      0.572290  0.572290  -0.479909     0.000000
     -1.046103 -1.046103  -1.640504     0.000000
     -0.395438 -0.395438  -0.506313     0.000000
      0.722509  0.722509   0.408912     0.000000
      1.293353  0.337776  -0.168297     0.990000
     -1.227133  0.723976   0.878665     0.990000
     -0.797757  0.915007  -1.672020     0.990000
      0.622970  0.030374   1.700830    -0.977129
     -0.831948 -0.084003  12.000000     0.000000
      0.285812 -0.110511  12.000000     0.000000

答案 1 :(得分:1)

第一项任务,使用布尔掩码查找符合条件的所有值并分配新值,这是一个通用场景,我不太了解您要做的事情:

In [14]:

df = pd.DataFrame({'a':np.random.randn(10),'b':np.random.randn(10),'c':np.random.randn(10)})
df
Out[14]:
          a         b         c
0 -0.015551  1.861532  0.028729
1  0.567215  2.193496 -1.070560
2  0.209520 -0.425338 -0.619085
3 -0.065431 -0.016801  0.382174
4  1.832790 -0.488823 -0.674983
5 -0.737770 -2.596719  0.121268
6  0.000486  0.022497  0.586638
7 -1.006143  0.808605  0.248115
8  1.409578 -0.467725 -1.249656
9 -0.776510  0.895553  0.233154
In [15]:

df[df>0.99] = 0.99
df
Out[15]:
          a         b         c
0 -0.015551  0.990000  0.028729
1  0.567215  0.990000 -1.070560
2  0.209520 -0.425338 -0.619085
3 -0.065431 -0.016801  0.382174
4  0.990000 -0.488823 -0.674983
5 -0.737770 -2.596719  0.121268
6  0.000486  0.022497  0.586638
7 -1.006143  0.808605  0.248115
8  0.990000 -0.467725 -1.249656
9 -0.776510  0.895553  0.233154

任务2 + 3。

In [19]:
# create dummy data
df = pd.DataFrame({'a':[1,1,3,4],'b':[1,2,3,4],'c':[1,22,11,11], 'probability':np.random.randn(4)})
df
Out[19]:
   a  b   c  probability
0  1  1   1     0.273157
1  1  2  22    -0.027685
2  3  3  11    -0.051091
3  4  4  11     0.630943
In [20]:
# use loc with a boolean condition to set just the rows that meet your condition
df.loc[df['a']==df['b'],'probability']=0
df
Out[20]:
   a  b   c  probability
0  1  1   1     0.000000
1  1  2  22    -0.027685
2  3  3  11     0.000000
3  4  4  11     0.000000
In [21]:
# now do the same for the other column
df.loc[df['c']>=11, 'probability'] = 0
df
Out[21]:
   a  b   c  probability
0  1  1   1            0
1  1  2  22            0
2  3  3  11            0
3  4  4  11            0

你的尝试没有成功:

test['Probability'] = test.apply(lambda r: '0.99' if r['Probability] == '0.99')

这不会起作用,因为你正在调用df上的应用,当然这将迭代列,你试图检查概率列,它不清楚你在这里想要做什么,您只检查概率列或所有列吗?

你的列表理解没有意义,你只是重建df并尝试比较值,但它试图将一些元组作为新的计算值。