【问题标题】:Keeping track of occurrence of unique IDs in time series跟踪时间序列中唯一 ID 的出现
【发布时间】:2016-05-11 14:26:57
【问题描述】:

我需要您的帮助来跟踪以前在 pandas 数据框中的观察结果。

例子:

df = pd.DataFrame({'ID':[1,2,3,1,2,4,1,3,5]},
                  index = ['2015-01-01','2015-01-01','2015-01-01',
                           '2015-01-02','2015-01-02','2015-01-02',
                           '2015-01-03','2015-01-03','2015-01-03'])

我想返回一个简单的输出(pandas 数据框或列表),其中包含日期和当天的观察结果以及之前看到的任何其他独特观察结果

期望的输出:

2015-01-01    [1,2,3]
2015-01-02    [1,2,3,4]
2015-01-03    [1,2,3,4,5]

我觉得这在 pandas 中将是一个非常简单的操作,但我迷路了。你能帮我指出正确的方向吗?

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    按日期获取独特的观察结果很容易:

    daily_observations = df.groupby(level=0).ID.apply(lambda s: s.unique())
    
    >>> daily_observations
    2015-01-01    [1, 2, 3]
    2015-01-02    [1, 2, 4]
    2015-01-03    [1, 3, 5]
    Name: ID, dtype: object
    

    积累它们更加困难:

    >>> pd.Series({idx: list(set().union(*[v.tolist() 
                        for v in daily_observations.loc[daily_observations.index <= idx].values])) 
                   for idx in daily_observations.index})
    
        2015-01-01          [1, 2, 3]
        2015-01-02       [1, 2, 3, 4]
        2015-01-03    [1, 2, 3, 4, 5]
        dtype: object
    

    该部分代码拉取所有出现的列表的累积列表。

    >>> [daily_observations.loc[daily_observations.index <= idx].values for idx in daily_observations.index] 
    [array([array([1, 2, 3])], dtype=object),
     array([array([1, 2, 3]), array([1, 2, 4])], dtype=object),
     array([array([1, 2, 3]), array([1, 2, 4]), array([1, 3, 5])], dtype=object)]
    

    然后将其从数组转换为每个索引值的列表列表:

    >>> [[v.tolist() for v in daily_observations.loc[daily_observations.index <= idx].values] for idx in daily_observations.index]
    [[[1, 2, 3]], [[1, 2, 3], [1, 2, 4]], [[1, 2, 3], [1, 2, 4], [1, 3, 5]]]
    

    这些列表列表然后通过联合转换为集合,然后再转换回列表。

    >>> [list(set().union(*[v.tolist() 
                            for v in daily_observations.loc[daily_observations.index <= idx].values])) 
              for idx in daily_observations.index]
    [[1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
    

    然后将上述所有内容包装在字典理解中,然后用于构造系列。

    【讨论】:

      【解决方案2】:

      如果有大量值,这可能不是最好的主意,我提醒您,pandas 对象并不是真正为保存非标量对象而设计的,但您可以使用get_dummies

      >>> d = pd.get_dummies(df["ID"])
      >>> m = d.cummax().groupby(level=0).last()
      >>> m.apply(lambda x: m.columns[x.astype(bool)].tolist(), axis=1)
      2015-01-01          [1, 2, 3]
      2015-01-02       [1, 2, 3, 4]
      2015-01-03    [1, 2, 3, 4, 5]
      dtype: object
      

      这是因为 dummies 给了我们一个成员表:

      >>> d
                  1  2  3  4  5
      2015-01-01  1  0  0  0  0
      2015-01-01  0  1  0  0  0
      2015-01-01  0  0  1  0  0
      2015-01-02  1  0  0  0  0
      2015-01-02  0  1  0  0  0
      2015-01-02  0  0  0  1  0
      2015-01-03  1  0  0  0  0
      2015-01-03  0  0  1  0  0
      2015-01-03  0  0  0  0  1
      

      然后我们可以累积这些:

      >>> d.cummax().groupby(level=0).last()
                  1  2  3  4  5
      2015-01-01  1  1  1  0  0
      2015-01-02  1  1  1  1  0
      2015-01-03  1  1  1  1  1
      

      【讨论】:

        猜你喜欢
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多