我需要你的帮助来跟踪熊猫数据框中以前的观察结果。
示例:
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]

我觉得在熊猫中这将是一个非常简单的操作,但我迷失了。你能帮忙指出我正确的方向吗?
由于
答案 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]]]
然后将上述所有内容包含在字典理解中,然后用于构建系列。