我有一个Excel文件,其中需要遵循某些条件,如果满足条件,请在“备注”列中输入。我得到了必要的列作为DataFrames,这是它的外观:
svc_no i_status caller_id f_status result remarks
11111 WO 11111 WO Not Match Duplicate svc_no
22222 WO 22222 WO Match
11111 WO n/a SP Not Match Duplicate svc_no
条件将是:
我用过.loc
并以此方式写
df.loc[(df['svc_no'] != 'NULL') & (df['svc_no'] == df['caller_id']) & (df['svc_no'].duplicated()) & (df['i_status'] == 'WO') & (df['f_status'] == 'WO') & (df['result'] == 'Not Match), [remarks]] = 'Duplicate svc_no'
此代码可能对第一个重复出现的行是正确的,不适用于其他重复出现的另一行。
问题:有没有办法我可以比较两行重复的行并使用.loc
应用必要条件?
答案 0 :(得分:1)
不清楚您想要什么作为所需的输出。但是您可以使用一系列布尔掩码找到标准所涵盖的所有svc_no
:
df = pd.DataFrame({'svc_no': [11111, 22222, 11111],
'caller_id': [11111, 22222, 'n/a'],
'result': ['Not Match', 'Match', 'Not Match']})
counts = df['svc_no'].value_counts()
grouper = df.groupby('svc_no')['caller_id']
cond1 = df['svc_no'].isin(counts[counts > 1].index)
cond2 = df['svc_no'].isin(df.loc[df['svc_no'] == df['caller_id'], 'svc_no'])
cond3 = df['svc_no'].isin(df.loc[grouper.apply(lambda x: x.isin(['n/a', 'NULL'])), 'svc_no'])
cond4 = df['svc_no'].isin(df.loc[df['result'] == 'Not Match', 'svc_no'])
df.loc[cond1 & cond2 & cond3 & cond4, 'remarks'] = 'Duplicate svc_no'
print(df)
caller_id result svc_no remarks
0 11111 Not Match 11111 Duplicate svc_no
1 22222 Match 22222 NaN
2 n/a Not Match 11111 Duplicate svc_no
答案 1 :(得分:0)
您必须告诉duplicated
您要标记所有重复项-默认情况下,它仅标记除第一次出现的值以外的所有内容:
df['svc_no'].duplicated(keep=False)