Python pandas проверяет дубликаты данных в качестве условия в loc - PullRequest
0 голосов
/ 03 июля 2018

У меня есть файл 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
  • Другой имеет значение ' n / a ' или ' NULL ' в caller_id
  • Результат Не совпадает

Я использовал .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 голосов
/ 03 июля 2018

Непонятно, что вы хотите в качестве желаемого результата. Но вы можете найти все 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
0 голосов
/ 03 июля 2018

Вы должны сообщить duplicated, что хотите отметить все дубликаты - по умолчанию он помечает только все, кроме первого вхождения значения:

df['svc_no'].duplicated(keep=False)

см. Также документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...