最近使用loc进行赋值时,在判断条件正确的情况下,却没能正确赋值。
示例代码如下,
import pandas as pd
import numpy as np
data = pd.DataFrame({'value': [1,1,2,2,3,1,2,3,5,1]})
data['status'] = np.NaN
condition1 = (data['value'] == 1) & (data['status'].isna())
condition2 = (data['value'] == 1) & (data['status'].isna())
condition3 = (data['value'] == 3) & (data['status'].isna())
data.loc[condition1, 'status'] = 1
data.loc[condition2, 'status'] = 2
data.loc[condition3, 'status'] = 3
data
正确的输出应该是
- 若(value == 1) & (status为空值) 则赋给status的值为1
- 若(value == 1) & (status为空值) 则赋给status的值为2
- 若(value == 3) & (status为空值) 则赋给status的值为3
原本来看,第一个loc结束之后,value == 1对应的status被赋值为1,已经不为空了,那么第二个loc(value == 1 且status非空值就不再有数据满足这个条件了,即status列的值不应该有2),
但是输出结果如下,
输出结果中,value==1的status值全部为2,不是我们想要的结果。
至于这里为什么不行,不清楚原因,欢迎大佬赐教。
修改代码如下,
import pandas as pd
import numpy as np
data = pd.DataFrame({'value': [1,1,2,2,3,1,2,3,5,1]})
data['status'] = np.NaN
condition1 = (data['value'] == 1) & (data['status'].isna())
data.loc[condition1, 'status'] = 1
condition2 = (data['value'] == 1) & (data['status'].isna())
data.loc[condition2, 'status'] = 2
condition3 = (data['value'] == 3) & (data['status'].isna())
data.loc[condition3, 'status'] = 3
data
将每一个loc都跟在对应的条件后面,输出结果如下,
输出结果无误。