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

时间:2019-08-23 20:04:07

标签: python pandas pandas-groupby

我想在一个列上进行最小展开,同时遵循基于另一列的条件:

_id

这些行按时间从最早到最新的顺序排列,并显示用户statusaccount进行a更改的时间。因此,在这里我们可以看到用户2在某个时间点将帐户status标记为2 1,然后将该值更新为status_hist

我需要一个a列来显示min所有帐户的全局状态,其中全局状态定义为所有现有状态的0。在索引status_hist处只有一个状态,因此1为3,在索引status_hist处现在有两个状态,而3为1,依此类推。当我们建立索引1时,全局状态应从2更改为account,因为状态2 df.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) 轻松地做到这一点,但是如果有更快的方法,我想避免这样做。如果可以帮助澄清我所追求的,这是itertuples解决方案:

  _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

给出:

{{1}}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以在“帐户”列上使用get_dummies,再乘以“状态”中的values。然后使用mask用nan替换0,以便能够对每个'_id'ffill,最后将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