跟踪时间序列中唯一ID的出现

时间:2016-02-02 16:54:31

标签: python 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 dataframe或list),其中包含当天的日期和观察结果以及之前看到的任何其他独特观察

期望的输出:



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




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

由于

2 个答案:

答案 0 :(得分: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

这是有效的,因为假人给了我们一张会员桌:

>>> 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

答案 1 :(得分:1)

按日期获取独特的观察结果很简单:

...
'components' => [ 
    'cdt' => [
        'class' => 'common\components\helper\CustomDateTime',
    ],
    ...
]
...

累积它们更加困难:

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]]]

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