我有一个pandas数据帧,我想添加一列并根据某些条件设置某些值。
初始化
参见以下示例:
import numpy as np
import pandas as pd
df=pd.DataFrame(np.reshape(np.arange(20),(5,4)).tolist(),columns=list('ABCD'))
df['E']=''
df.loc[0,'E']=1
df
在此之前,一切如愿以偿。输出:
A B C D E
0 0 1 2 3 1
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
4 16 17 18 19
问题
但现在,我想将第一行中'B'值大于8的'E'列的值设置为3(与df.loc[2,'E']=1
相同,但使用该条件。我不知道它是先验的哪一行(。
解决方案尝试
我尝试过不同的东西:
df.loc[df['B']>8,'E'].iloc[0]=3
df
这不会改变任何值:
A B C D E
0 0 1 2 3 1
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
4 16 17 18 19
也是如此
df.loc[df['B']>8]['E'].iloc[0]=3
我尝试过的其他事情都会导致错误。df.loc[df['B']>8,'E']=3
运行良好,但我只想在满足条件的第一行中赋值,而不是在所有行中赋值。
那么我该如何做到这一点呢?
使用.idxmax()
。由于True
是True
/False
的最大值,因此它将返回布尔索引的第一个True
值的索引。
df.loc[(df['B']>8).idxmax(),'E']=3