如何在删除空元素后上移所有列表元素



我正在使用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.

和更改为

index,0
0,0.0
1,1.0
2,3.0
4,4.0
5,5.0

使用dropna()后

可以看到,表从2跳到4。

在我的for循环中,我让它计算一个范围(1-150000)内每周的总时间,但由于没有第8行和其他行,它抛出一个错误并停止循环。

所以…我的问题是,我如何运行我的for循环,使它跳过这些不存在的行。

还有,这是我的代码:

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)

给定一个字典列表:

data = [{'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'}]

做:

df = pd.json_normalize(data)
print(df)

输出:

Monday    Tuesday  Wednesday   Thursday     Friday   Saturday     Sunday
0   0:0-0:0  8:0-18:30  8:0-18:30  8:0-18:30  8:0-18:30   8:0-14:0        NaN
1  8:0-22:0   8:0-22:0   8:0-22:0   8:0-22:0   8:0-23:0   8:0-23:0   8:0-22:0
2  7:0-20:0   7:0-20:0   7:0-20:0   7:0-20:0   7:0-21:0   7:0-21:0   7:0-21:0
3       NaN        NaN  14:0-22:0  16:0-22:0  12:0-22:0  12:0-22:0  12:0-18:0
4   0:0-0:0   6:0-22:0   6:0-22:0   6:0-22:0    9:0-0:0   9:0-22:0   8:0-22:0
5   0:0-0:0  10:0-18:0  10:0-18:0  10:0-18:0  10:0-18:0  10:0-18:0  12:0-18:0
6  9:0-17:0   9:0-17:0   9:0-17:0   9:0-17:0   9:0-17:0        NaN        NaN
7       NaN        NaN        NaN        NaN        NaN        NaN        NaN
8   0:0-0:0   6:0-21:0   6:0-21:0   6:0-16:0   6:0-16:0   6:0-17:0   6:0-21:0

删除NaN行,并重置索引:

df = df.dropna(how='all').reset_index(drop=True)
print(df)

输出:

Monday    Tuesday  Wednesday   Thursday     Friday   Saturday     Sunday
0   0:0-0:0  8:0-18:30  8:0-18:30  8:0-18:30  8:0-18:30   8:0-14:0        NaN
1  8:0-22:0   8:0-22:0   8:0-22:0   8:0-22:0   8:0-23:0   8:0-23:0   8:0-22:0
2  7:0-20:0   7:0-20:0   7:0-20:0   7:0-20:0   7:0-21:0   7:0-21:0   7:0-21:0
3       NaN        NaN  14:0-22:0  16:0-22:0  12:0-22:0  12:0-22:0  12:0-18:0
4   0:0-0:0   6:0-22:0   6:0-22:0   6:0-22:0    9:0-0:0   9:0-22:0   8:0-22:0
5   0:0-0:0  10:0-18:0  10:0-18:0  10:0-18:0  10:0-18:0  10:0-18:0  12:0-18:0
6  9:0-17:0   9:0-17:0   9:0-17:0   9:0-17:0   9:0-17:0        NaN        NaN
7   0:0-0:0   6:0-21:0   6:0-21:0   6:0-16:0   6:0-16:0   6:0-17:0   6:0-21:0

做你的功能正确:

def myFunc(v):
if isinstance(v, str):
start, end = v.split('-')
hhs, mms = (int(v) for v in start.split(':'))
hhe, mme = (int(v) for v in end.split(':'))
return (hhe * 60 + mme) - (hhs * 60 + mms)
else:
return v 
df = df.applymap(myFunc)     

输出:

Monday  Tuesday  Wednesday  Thursday  Friday  Saturday  Sunday
0     0.0    630.0      630.0     630.0   630.0     360.0     NaN
1   840.0    840.0      840.0     840.0   900.0     900.0   840.0
2   780.0    780.0      780.0     780.0   840.0     840.0   840.0
3     NaN      NaN      480.0     360.0   600.0     600.0   360.0
4     0.0    960.0      960.0     960.0  -540.0     780.0   840.0
5     0.0    480.0      480.0     480.0   480.0     480.0   360.0
6   480.0    480.0      480.0     480.0   480.0       NaN     NaN
7     NaN      NaN        NaN       NaN     NaN       NaN     NaN
8     0.0    900.0      900.0     600.0   600.0     660.0   900.0

总额:

>>> df.sum().sum()
30600.0

矢量化(ish),并使用timedelta而不是重新发明轮子:

for col in df:
x = df[col].str.extract('(d*):(d*)-(d*):(d*)').astype(float)
h = x.loc[:, ::2].apply(pd.to_timedelta, unit='h')
m = x.loc[:, 1::2].apply(pd.to_timedelta, unit='m')
x = h + m.values
df[col] = x[2] - x[0]
>>> df.sum().sum()
Timedelta('21 days 06:00:00')
>>> df.sum().sum().total_seconds() // 60
30600.0
>>> df
Monday         Tuesday       Wednesday        Thursday            Friday        Saturday          Sunday
0 0 days 00:00:00 0 days 10:30:00 0 days 10:30:00 0 days 10:30:00   0 days 10:30:00 0 days 06:00:00             NaT
1 0 days 14:00:00 0 days 14:00:00 0 days 14:00:00 0 days 14:00:00   0 days 15:00:00 0 days 15:00:00 0 days 14:00:00
2 0 days 13:00:00 0 days 13:00:00 0 days 13:00:00 0 days 13:00:00   0 days 14:00:00 0 days 14:00:00 0 days 14:00:00
3             NaT             NaT 0 days 08:00:00 0 days 06:00:00   0 days 10:00:00 0 days 10:00:00 0 days 06:00:00
4 0 days 00:00:00 0 days 16:00:00 0 days 16:00:00 0 days 16:00:00 -1 days +15:00:00 0 days 13:00:00 0 days 14:00:00
5 0 days 00:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00   0 days 08:00:00 0 days 08:00:00 0 days 06:00:00
6 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00 0 days 08:00:00   0 days 08:00:00             NaT             NaT
7 0 days 00:00:00 0 days 15:00:00 0 days 15:00:00 0 days 10:00:00   0 days 10:00:00 0 days 11:00:00 0 days 15:00:00

首先,df_new[i]沿着列索引df_new,而不是索引(似乎是您想要的)。相反,使用df_new.loc[i],其中沿着列进行索引。此外,您可以使用try/except语句来捕获任何引发的KeyError异常。

df_new = df_hours.dropna()
for i in range(1,150000):
try:
dc = df_new.loc[i]
except KeyError:
continue
...

但是,您应该只遍历DataFrameindex,这避免了任何KeyError异常:

df_new = df_hours.dropna()
for i in df_new.index:
...

相关内容

  • 没有找到相关文章

最新更新