[英]updating cell values with if conditions pandas dataframe
我遇到了一些问题,其中我使用了 for 循环和 if 条件来更新数据框。 它们应该是非常基本的 python 逻辑,但我在网上找不到解释,所以我想在这里问一下。
出于说明目的,让我们看一个简单的数据框 df:
1 2
0 1 0
1 0 1
2 1 0
3 0 0
4 1 1
我想要基于前两列值的第三列:
最初我写道:
for i in range(len(df)):
if df.loc[i,'1']==1 & df.loc[i,'2']==0:
df.loc[i,'3']=1
else:
df.loc[i,'3']=0
但我得到了这个:
1 2 3
0 1 0 0.0
1 0 1 0.0
2 1 0 0.0
3 0 0 1.0
4 1 1 0.0
然后我发现当我在我的条件中添加方括号时它起作用了:所以我使用了if df.loc[i,'1']==1 & df.loc[i,'2']==0:
if (df.loc[i,'1']==1) & (df.loc[i,'2']==0):
那么为什么会这样呢?
此外,我正在测试即使只有一种情况我是否总是需要支架:
for i in range(len(df)):
if df.loc[1,'2']==1:
df.loc[1,'4']=0
else:
df.loc[1,'4']=1
另一个问题发生在我缺少值并且只更新单元格 df.loc[1,'4'] 的地方:
1 2 3 4
0 1 0 1.0 NaN
1 0 1 0.0 0.0
2 1 0 1.0 NaN
3 0 0 0.0 NaN
4 1 1 0.0 NaN
我真的很困惑,这次添加括号并没有改变任何东西。 为什么会这样?
除了这两个问题,我更新单元格值的方法一般来说是错误的吗?
矢量化解决方案是将按位AND
的&
链式掩码转换为整数,以将True, False
映射到1,0
:
df['3'] = ((df['1'] == 1) & (df['2'] == 0)).astype(int)
您的解决方案使用标量,因此使用and
而不是&
使用数组(不推荐):
for i in range(len(df)):
if df.loc[i,'1']==1 and df.loc[i,'2']==0:
df.loc[i,'3']=1
else:
df.loc[i,'3']=0
print (df)
1 2 3
0 1 0 1.0
1 0 1 0.0
2 1 0 1.0
3 0 0 0.0
4 1 1 0.0
不要使用循环,这是 pandas 中的反模式,使用:
df['3'] = (df['1'].eq(1) & df['2'].eq(0)).astype(int)
df['4'] = df['2'].ne(1).astype(int)
# or, if only 0/1
# df['4'] = 1 - df['2']
此外,使用eq
代替==
避免需要用圆括号括起相等性以尊重运算符优先级。
输出:
1 2 3 4
0 1 0 1 1
1 0 1 0 0
2 1 0 1 1
3 0 0 0 1
4 1 1 0 0
你最好使用np.where
:
import numpy as np
df['3'] = np.where (df['1']==1 & df['2']==0, 1, 0)
如果第 1 列等于 1 且第 2 列等于 0,则将值 1 放入第 3 列。
df.loc[(df["1"] == 1)&(df["2"] == 0), "3"] = 1
如果第 1 列不等于 1 或第 2 列不等于 0,则将值 0 放入第 3 列。
df.loc[(df["1"] != 1)|(df["2"] != 0), "3"] = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.