Не можете перебрать кадр данных при сравнении со словарем? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть и словарь, и фрейм данных, и я пытаюсь перебрать каждую строку фрейма данных, сравнивая определенный столбец df со значением соответствующего ключа словаря.Я делаю это через цикл.Однако я продолжаю получать ошибки.

Одна ошибка типа, которую я получаю, это: объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать.Я понимаю происхождение этой ошибки, однако, когда я пытаюсь изменить ключи словаря на строковые типы, они остаются как типы объектов.Если я пытаюсь изменить весь словарь на строковый тип, то при запуске цикла for я получаю ошибку типа строковых индексов, которые должны быть целыми числами.

Спасибо за любую помощь, не знаю, в каком направлении идти сюда.

Вот словарь (otc_dict):

{'ALIVE MENS 50+': 0.25,
 'AM LACTATE 12% LOTION': 0.11089,
 'AMOX/CLAV 875MG TABS': 1.32,
  'APAP 325MG TABS (GH).': 0.03,
  'APAP 500MG (GH)': 0.05,
  'AQUAPHOR OINT': 0.11105999999999999,
  'AVEENO ULT-CALM SPF 15': 0.14125,
  'B-COMPLEX (GH)': 0.05,
  'BABY SHAMPOO': 0.01329,
  'BABY SHAMPOO J&J': 0.01995,
  'BACITRACIN FOIL PACK': 0.208,
  'BACLOFEN 10MG TABS': 0.185,
  'BATH CHAIR WITH BACK': 69.95,
  'BENZONATATE 100MG CAP': 0.49833,
  'BENZOYL PEROX 5% WASH 227*': 0.08789}

Вот кадр данных (aug_new):

      Rx Number Drug Name           Price Per
 0  0903-333 00 MELATONIN 5MG           0.083333
 1  0903-460 00 MULTIVI W/MINERALS (GH) 0.060000
 2  0903-632 00 RISPERIDONE 2MG TAB*    0.531667
 3  0903-633 00 CLONIDINE 0.1MG TAB*    0.165833
 4  0903-634 00 RISPERIDONE 3MG TAB*    0.598333
 5  0904-192 00 MULTIVITAMINS TABS (GH) 0.050000
 6  0895-624 06 VIT D3 2000IU TABS  0.100000
 7  0896-257 03 MULTIVI W/MINERALS (GH) 0.060000

Вот цикл for, который я пытаюсь выполнить:

outliers = []
for row in aug_new.index:
    price = aug_new['Price Per']
    drug = aug_new['Drug Name']
    value = otc_dict[drug]
    rx = aug_new['Rx Number']
    if price != value:
        outliers.append(rx)

По сути, я просто пытаюсь составить список номеров Rx, чья «цена за» не соответствует цене, соответствующей названию препарата в словаре.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Используя price = aug_new['Price Per'], вы используете весь столбец (серию) «Цена за», а не только значение в этой строке.

Вы можете использовать:

outliers = []
for idx in aug_new.index:
    price = aug_new.loc[idx, 'Price Per']
    drug = aug_new.loc[idx, 'Drug Name']
    value = otc_dict[drug]
    rx = aug_new.loc[idx, 'Rx Number']
    if price != value:
        outliers.append(rx)

или использовать df.iterrows():

outliers = []
for idx , row in aug_new.iterrows():
    price = row['Price Per']
    drug = row['Drug Name']
    value = otc_dict[drug]
    rx = row['Rx Number']
    if price != value:
        outliers.append(rx)

Если время вычислений является проблемой, метод .loc[] быстрее.(Пример из другого набора данных):

%timeit for idx, row in df.iterrows(): print(row['DateTime'])
1.3 ms ± 25.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit for idx in df.index: print(df.loc[idx, 'DateTime'])
619 µs ± 23.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0 голосов
/ 24 сентября 2019

Вместо:

price = aug_new['Price Per']

Попробуйте:

price = aug_new.iloc[row]['Price Per']

1-й возвращает целую серию, побеждая цель итерации по строкам.Тогда как вторая возвращает вам конкретное значение, хранящееся в строке индекса и столбце «Цена за».

То же самое относится и к остальным назначениям.Обратите внимание, что, в частности, ошибка вызвана

drug = aug_new['Drug Name']
value = otc_dict[drug]

. Она возвращает вам серию «наркотиков», а не одно строковое значение, и является неверным ключом для словаря «otc_dict».

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