使用if条件更新像元值pandas Dataframe

xoshrz7s  于 2022-12-16  发布在  其他
关注(0)|答案(4)|浏览(157)

我在使用for循环和if条件更新 Dataframe 时遇到了一些问题,它们应该是非常基本的python逻辑,但我在网上找不到解释,所以我想在这里问一下。
为了便于说明,我们来看一个简单的 Dataframe df:
我希望第三列基于前两列的值:
最初我写道:

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

但我有这个
然后我发现,当我在条件中添加括号时,它就起作用了:所以我用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 ']被更新:
我真的很困惑,这次加了括号也没有什么变化,为什么会这样呢?
除了这两个问题,我更新单元格值的方法一般来说是错误的吗?

dl5txlt9

dl5txlt91#

矢量化解决方案是通过&将链式掩码按位AND转换为整数,以便将True, FalseMap到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
mkh04yzy

mkh04yzy2#

最好使用np.where

import numpy as np
 df['3'] = np.where (df['1']==1 & df['2']==0, 1, 0)
fwzugrvs

fwzugrvs3#

不要使用循环,这是panda中的反模式,用途:

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代替==可以避免使用括号将等式括起来以考虑运算符优先级。
输出:

0aydgbwb

0aydgbwb4#

如果Clomuns1等于1且Clomuns2等于0,则将Clomuns3值设置为1

df.loc[(df["1"] == 1)&(df["2"] == 0), "3"] = 1

如果clomuns 1不等于1或clomuns 2不等于0,则将clomuns 3值设置为1

df.loc[(df["1"] != 1)|(df["2"] != 0), "3"] = 0

相关问题