我同时拥有一个字典和一个数据框,并且我试图遍历该数据框的每一行,将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数字列表。
答案 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)