Python 大熊猫如何进行条件比较

Python 大熊猫如何进行条件比较,python,pandas,Python,Pandas,我在熊猫中有以下数据帧 code prod_a prod_b flag 123 MS MS to be checked 123 HS MS more than 1 prod 123 MS HS to be checked 123 HS MS more than 1 prod 123 MS

我在熊猫中有以下数据帧

code     prod_a      prod_b     flag
123      MS          MS         to be checked
123      HS          MS         more than 1 prod
123      MS          HS         to be checked
123      HS          MS         more than 1 prod
123      MS          MS         to be checked
我只想比较prod_a和prod_b,其中
flag=要检查
,其他标志
超过1个prod
保持不变。我想要的数据帧如下

code     prod_a      prod_b     flag               final_flag
123      MS          MS         to be checked      matched
123      HS          MS         more than 1 prod   more than 1 prod   
123      MS          HS         to be checked      not matched
123      HS          MS         more than 1 prod   more than 1 prod
123      MS          MS         to be checked      matched
我怎样才能在熊猫身上做到这一点


数据帧的重新创建:

import pandas as pd

data = '''\
code,prod_a,prod_b,flag
123,MS,MS,to be checked
123,HS,MS,more than 1 prod
123,MS,HS,to be checked
123,HS,MS,more than 1 prod
123,MS,MS,to be checked
'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep=',')
尝试:

df['final_flag'] = df.apply(lambda x : 'matched' if x['flag'] == 'to be checked' and x['prod_a'] == x['prod_b'] else 'not matched')
通过
&
使用链条件进行按位
操作,并通过
~
进行反转:

m1 = df['flag'].eq('to be checked')
m2 = df.prod_a.eq(df.prod_b)

df['final_flag'] = np.select([m1 & m2, m1 & ~m2],['matched','not matched'],default=df['flag'])
print (df)
   code prod_a prod_b              flag        final_flag
0   123     MS     MS     to be checked           matched
1   123     HS     MS  more than 1 prod  more than 1 prod
2   123     MS     HS     to be checked       not matched
3   123     HS     MS  more than 1 prod  more than 1 prod
4   123     MS     MS     to be checked           matched
@Anton vBR的解决方案:

m1 = df['flag'].eq('to be checked')
m2 = df.prod_a.eq(df.prod_b)

df['final_flag'] = df['flag']
df.loc[m1 & m2, 'final_flag'] = 'matched'
df.loc[m1 & ~m2, 'final_flag'] = 'not matched'
print (df)
   code prod_a prod_b              flag        final_flag
0   123     MS     MS     to be checked           matched
1   123     HS     MS  more than 1 prod  more than 1 prod
2   123     MS     HS     to be checked       not matched
3   123     HS     MS  more than 1 prod  more than 1 prod
4   123     MS     MS     to be checked           matched

这应该有效

@AntonvBR-Hmmm,补充解决方案。如果不指定或最后一次填充,可能会更好:)
def udf(row):
    if row.flag == 'to be checked':
        if row.prod_a == row.prod_b:
            return "matched"
        else:
            return "not matched"
    else:
        return row.flag

df['final_flag'] = df.apply(lambda row: udf(row), axis = 1)