我想在一个列上进行最小展开,同时遵循基于另一列的条件:
_id
这些行按时间从最早到最新的顺序排列,并显示用户status
对account
进行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}}
感谢您的帮助!
答案 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