代码之家  ›  专栏  ›  技术社区  ›  Tegh Singh

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

  •  1
  • Tegh Singh  · 技术社区  · 2 年前

    我使用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'}
    

    这种情况持续到150000个元素。

    正如您所看到的,一个元素没有任何信息,而是说“无”。我使用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)
    
    2 回复  |  直到 2 年前
        1
  •  3
  •   BeRT2me    2 年前

    给出一个dict列表:

    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
    
        2
  •  1
  •   Jacob Lee    2 年前

    首先 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
        ...
    

    但是,您应该迭代 index DataFrame ,避免了任何 KeyError 例外情况:

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