我有一个概率列,其中一些值大于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
感谢大家的帮助。
答案 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并尝试比较值,但它试图将一些元组作为新的计算值。