如何处理KeyError(key)


import pandas as pd
colnames = ['Date', 'Items', 'Quantity', 'Price']
df1 = pd.read_csv('data_assignment_1.txt',sep=" ",names=colnames, header=None)
print(df1)

Output:
Date   Items  Quantity  Price
0  2020-09-23  Item_A         1    1.9
1  2020-09-23  Item_B         1    1.2
2  2020-09-23  Item_A         2    1.9
3  2020-09-23  Item_B         1    1.2
4  2020-09-24  Item_A         1    1.9
5  2020-09-24  Item_B         1    1.2
6  2020-09-24  Item_C         1    1.3
7  2020-09-25  Item_D         1    2.7

现在我按日期和项目分组来查找总数量:

groupby_date_item = df1.groupby(['Date', 'Items'])['Quantity'].sum()
print(groupby_date_item['2020-09-23','Item_A'])
Output result:
3

现在的问题是,如果我把项目D与日期2020-09-23,我将得到一个错误:

print(groupby_date_item['2020-09-23','Item_D'])
Output result:
raise KeyError(key) from err
KeyError: ('2020-09-23', 'Item_d')

如果项目在该日期不存在或输入错误的日期和项目,我如何处理错误?

正如您所发现的,如果您试图检索一个不存在的值,您将得到一个错误。解决这个问题的一种方法是使用try-except子句。

请参见下面的示例,其中我使用一个自定义函数来使用try-except子句处理数据检索。如果函数产生错误,它将返回0

代码:

import numpy as np
import pandas as pd
def get_Item(my_Date, my_Item, gb_date_item):
try:
total_sale = gb_date_item[my_Date, my_Item]
except:
total_sale = 0

return f"Total Sale on: {my_Date} for {my_Item} : {total_sale}"
df1 = pd.DataFrame({ 'Date': ['2020-09-23', '2020-09-23', '2020-09-23', '2020-09-23', '2020-09-24', '2020-09-24', '2020-09-24', '2020-09-25'],
'Items': ['Item_A', 'Item_B', 'Item_A', 'Item_B', 'Item_A', 'Item_B', 'Item_C', 'Item_D'],
'Quantity': [1, 1, 2, 1, 1, 1, 1, 1],
'Price': [1.9, 1.2, 1.9, 1.2, 1.9, 1.2, 1.3, 2.7]})
groupby_date_item = df1.groupby(['Date', 'Items'])['Quantity'].sum()
print(get_Item('2020-09-23', 'Item_A', groupby_date_item))
print(get_Item('2020-09-23', 'Item_B', groupby_date_item))
print(get_Item('2020-09-23', 'Item_D', groupby_date_item))
输出:

Total Sale on: 2020-09-23 for Item_A : 3
Total Sale on: 2020-09-23 for Item_B : 2
Total Sale on: 2020-09-23 for Item_D : 0

注意:

当没有找到日期时,将0替换为您想要显示的任何内容。

except:
total_sale = 0  # Replace this value

这里是检查键的另一种选择。简单地说,直接针对您的问题,您只需使用if ('2020-09-23', 'Item_D') in groupby_date_item: ...

这是一个更完整的例子:

import pandas as pd
df1 = pd.DataFrame({
"Date":['2020-09-23','2020-09-23','2020-09-25'],
"Items":['Item_A','Item_A','Item_D'],
"Quantity":[1,1,1]
})
g = df1.groupby(['Date','Items'])['Quantity'].sum()
for tup in [('2020-09-23', 'Item_A'), ('2020-09-23', 'Item_D')]:
if tup in g.index:
print(f'{str(tup)}: {g[tup]}')
else:
print(f'{str(tup)}: not found')

最新更新