熊猫:Groupby具有不断扩大的应用和条件

Yobogoya

我想对一栏进行最小化,同时遵循基于另一栏的条件:

df = pd.DataFrame({'_id': ['a','a', 'a', 'a', 'a'], 
                   'account': [1,2,3,2,5], 
                   'status':[3, 1, 5, 2, 7]})

  _id  account  status
0   a        1       3
1   a        2       1
2   a        3       5
3   a        2       2
4   a        5       7

该行按时间顺序从最早的命令最新,当用户展示_id做出status改变account因此,在这里我们可以看到用户在某个时间点将a帐户标记2status1,然后将该值更新为2

我需要一status_hist列来显示所有a帐户的全局状态,其中全局状态定义为min所有现有状态的。在索引0处只有一个状态,所以status_hist是3,在索引1处现在有两个状态,并且status_hist是1,依此类推。当我们进入index时3,全局状态应从更改12,因为状态account 2现已更改。

我可以轻松地做到这一点df.itertuples(),但是如果有更快的方法,我想避免这样做。如果有助于澄清我所追求的,这是itertuples解决方案:

df2 = pd.DataFrame()

for _, group in df.groupby('_id'):
    res = []
    statuses = defaultdict()
    for row in group.itertuples():
        statuses[row.account] = row.status
        res.append(min(statuses.values()))

    group['status_hist'] = res
    df2 = df2.append(group)

这使:

  _id  account  status  status_hist
0   a        1       3            3
1   a        2       1            1
2   a        3       5            1
3   a        2       2            2
4   a        5       7            2

谢谢您的帮助!

我想要一片T骨牛排

您可以get_dummies在“帐户”列上使用,乘以values“状态”。然后使用masknan将0替换为nan以便能够对ffill每个'_id'进行分组,最后接受min诸如以下的列:

df_dummies = pd.get_dummies(df.account)*df.status.values[:,None]
df['status_hist'] = df_dummies.mask(df_dummies.eq(0)).groupby(df._id).ffill().min(axis=1)
print (df)
  _id  account  status  status_hist
0   a        1       3          3.0
1   a        2       1          1.0
2   a        3       5          1.0
3   a        2       2          2.0
4   a        5       7          2.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章