【问题标题】:Comparing Next Item with Previous Item in a Dictionary比较字典中的下一个项目和上一个项目
【发布时间】:2019-05-31 14:03:51
【问题描述】:

我想对熊猫系列中的项目进行比较。如果项目不等于下一个值,则追加到列表中,否则继续。我认为我的代码正在运行,除了它在最后一次出现时失败,因为 items[k+1] 的索引超出了范围。如何让它停止在最后一行进行比较?

我这样做是因为我有一个按日期排序的数据集,但我没有时间戳字段。我只知道开始的月份和年份,以及结束的月份和年份。

但是,一个包含的字段(euribor3m 字段)应该是每日费率,所以我希望我可以将每一天分开,然后通过将行与下一行进行比较并注意是否值因为领域已经改变。如果有,这将意味着新行映射到新的一天,并且由于这些行是按天排序的,我应该希望得到与开始月份年份和结束月份年份之间的天数相匹配的 x 天数

items = dict(enumerate(df['euribor3m']))
unique = []

for k,i in items.items():
    if items[k+1] != items[k]:
        unique.append(items[k+1])

【问题讨论】:

    标签: python python-3.x pandas dictionary series


    【解决方案1】:

    您可以为此使用shift()

    df = pd.DataFrame({'euribor3m':[5,5,7,7,8,9,11,11,34,45,45]})
    
    df0 = df.shift()
    
    mask = df['euribor3m']==df0['euribor3m']
    df_new = df[mask]
    print(list(df_new['euribor3m']))
    

    输出:

    [5, 7, 11, 45]
    

    【讨论】:

      【解决方案2】:

      一种解决方案是捕捉KeyError

      for k, i in items.items():
          try:
              if items[k+1] != items[k]:
                  unique.append(items[k+1])
          except KeyError:
              pass
      

      但您首先不应该以这种方式进行迭代,因为 Pandas 专注于矢量化操作。你可以改用shift

      df = pd.DataFrame({'euribor3m': [1, 1, 2, 3, 4, 5, 5, 6]})
      
      res = df.loc[df['euribor3m'].shift(-1) != df['euribor3m']]
      
      print(res)
      
      #    euribor3m
      # 1          1
      # 2          2
      # 3          3
      # 4          4
      # 6          5
      # 7          6
      

      【讨论】:

      • 谢谢!这是最好的答案,因为它不仅最优雅,而且还详细解释了问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      相关资源
      最近更新 更多