与字典比较时是否无法遍历数据框?

时间:2019-09-24 10:36:24

标签: python pandas dictionary

我同时拥有一个字典和一个数据框,并且我试图遍历该数据框的每一行,将df的特定列与对应的字典键的值进行比较。我正在通过for循环来执行此操作。但是我一直在出错。

我遇到的一种类型错误是:“系列”对象是可变的,因此无法进行哈希处理。我知道此错误的起因,但​​是当我尝试将字典的键更改为字符串类型时,它们仍保留为对象类型。如果我尝试将整个字典更改为字符串类型,则在运行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 :(得分:0)

代替:

price = aug_new['Price Per']

尝试:

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

第一个返回您整个序列,无法达到遍历行的目的。而第二个则返回给您存储在索引行和“每笔价格”列中的特定值。

其余的作业也一样。 请注意,该错误具体是由于

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

这将为您返回一系列“药物”,而不是单个字符串值,并且是字典“ otc_dict”的无效键。

答案 1 :(得分:0)

通过使用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)