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')