处理Yelp营业时间数据:dropna()后循环索引缺口问题求解
问题描述
我正在使用Yelp数据集获取多家商家的营业时间,每家商家的时间范围以字典形式存储在列表中,示例数据如下:
{'Monday': '0:0-0:0', 'Tuesday': '8:0-18:30', 'Wednesday': '8:0-18:30', 'Thursday': '8:0-18:30', 'Friday': '8:0-18:30', 'Saturday': '8:0-14:0'} {'Monday': '8:0-22:0', 'Tuesday': '8:0-22:0', 'Wednesday': '8:0-22:0', 'Thursday': '8:0-22:0', 'Friday': '8:0-23:0', 'Saturday': '8:0-23:0', 'Sunday': '8:0-22:0'} {'Monday': '7:0-20:0', 'Tuesday': '7:0-20:0', 'Wednesday': '7:0-20:0', 'Thursday': '7:0-20:0', 'Friday': '7:0-21:0', 'Saturday': '7:0-21:0', 'Sunday': '7:0-21:0'} {'Wednesday': '14:0-22:0', 'Thursday': '16:0-22:0', 'Friday': '12:0-22:0', 'Saturday': '12:0-22:0', 'Sunday': '12:0-18:0'} {'Monday': '0:0-0:0', 'Tuesday': '6:0-22:0', 'Wednesday': '6:0-22:0', 'Thursday': '6:0-22:0', 'Friday': '9:0-0:0', 'Saturday': '9:0-22:0', 'Sunday': '8:0-22:0'} {'Monday': '0:0-0:0', 'Tuesday': '10:0-18:0', 'Wednesday': '10:0-18:0', 'Thursday': '10:0-18:0', 'Friday': '10:0-18:0', 'Saturday': '10:0-18:0', 'Sunday': '12:0-18:0'} {'Monday': '9:0-17:0', 'Tuesday': '9:0-17:0', 'Wednesday': '9:0-17:0', 'Thursday': '9:0-17:0', 'Friday': '9:0-17:0'} None {'Monday': '0:0-0:0', 'Tuesday': '6:0-21:0', 'Wednesday': '6:0-21:0', 'Thursday': '6:0-16:0', 'Friday': '6:0-16:0', 'Saturday': '6:0-17:0', 'Sunday': '6:0-21:0'}
该列表共有150,000个元素,其中部分元素为None。使用dropna()移除空元素后,数据集出现索引缺口,导致计算总营业时间的for循环报错。
举个小例子说明问题:
初始表格:
index,0 0,0.0 1,1.0 2,3.0 3,NaN 4,4.0 5,5.0
使用dropna()后变为:
index,0 0,0.0 1,1.0 2,3.0 4,4.0 5,5.0
可见索引从2直接跳到4。
原本的循环通过遍历range(1,150000)来计算每周总营业时间,但因部分索引不存在而报错终止,代码如下:
df_new = df_hours.dropna() for i in range(1,150000): dc = df_new[i] print(dc) sum_elapsed = 0 for _, v in dc.items(): start, end = v.split('-') hhs, mms = (int(v) for v in start.split(':')) hhe, mme = (int(v) for v in end.split(':')) elapsed = (hhe * 60 + mme) - (hhs * 60 + mms) sum_elapsed += elapsed print(sum_elapsed)
请问如何修改循环,使其跳过这些不存在的索引行?
解决方案
方法1:直接遍历DataFrame元素
无需通过索引访问,直接遍历df_new的每一行,自动跳过缺失索引:
df_new = df_hours.dropna() for dc in df_new: print(dc) sum_elapsed = 0 for _, v in dc.items(): start, end = v.split('-') hhs, mms = (int(v) for v in start.split(':')) hhe, mme = (int(v) for v in end.split(':')) elapsed = (hhe * 60 + mme) - (hhs * 60 + mms) sum_elapsed += elapsed print(sum_elapsed)
方法2:重置索引
使用reset_index(drop=True)生成连续索引,之后可通过range遍历:
df_new = df_hours.dropna().reset_index(drop=True) for i in range(len(df_new)): dc = df_new[i] print(dc) sum_elapsed = 0 for _, v in dc.items(): start, end = v.split('-') hhs, mms = (int(v) for v in start.split(':')) hhe, mme = (int(v) for v in end.split(':')) elapsed = (hhe * 60 + mme) - (hhs * 60 + mms) sum_elapsed += elapsed print(sum_elapsed)
方法3:检查索引是否存在
若需保留原索引,可在循环中先判断索引是否存在于df_new的索引列表:
df_new = df_hours.dropna() for i in range(1,150000): if i not in df_new.index: continue dc = df_new[i] print(dc) sum_elapsed = 0 for _, v in dc.items(): start, end = v.split('-') hhs, mms = (int(v) for v in start.split(':')) hhe, mme = (int(v) for v in end.split(':')) elapsed = (hhe * 60 + mme) - (hhs * 60 + mms) sum_elapsed += elapsed print(sum_elapsed)
内容的提问来源于stack exchange,提问作者Tegh Singh
相关产品推荐
相关产品推荐

