Python Pandas将数据框重复值作为loc中的条件进行检查

时间:2018-07-03 15:07:09

标签: python pandas

我有一个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

条件将是:

  • svc_no是重复的
  • 重复项之一等于与caller_id相等的值
  • 另一个在caller_id中的值为' n / a '或' NULL '
  • 结果为不匹配

我用过.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应用必要条件?

2 个答案:

答案 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)

see also the docs