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)