python - pandas:具有扩展应用和条件的 Groupby
问题描述
我想对一列进行扩展最小值,同时遵循基于另一列的条件:
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
帐户标记2
为status
1,然后将该值更新为2
。
我需要一status_hist
列显示所有a
帐户的全局状态,其中全局状态定义为min
所有现有状态的。在索引0
处只有一个状态,所以status_hist
是 3,在索引1
处现在有两个状态,并且status_hist
是 1,依此类推。当我们到达 index3
时,全局状态应该从1
变为2
,因为状态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
谢谢,如果你能帮忙!
解决方案
您可以get_dummies
在“帐户”列上使用,乘以values
“状态”。然后用mask
nan 替换 0 以便能够对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
推荐阅读
- r - 如何使用 ggplot2 在 R 中绘制多个响应调查项目?
- c - 机器码是如何从汇编中生成的?
- java - 我们应该如何在不使用 @XMLRootElement 的情况下配置响应对象
- ios - 如何快速将数据从第二个 VC 传递到第一个 VC 中容器内的 VC
- javascript - 如何使用 a 标签指向另一页上图像幻灯片中的图片
- activemq-artemis - 嵌入式 ActiveMQ Artemis 不支持管理 (getQueueNames)
- ios - 发布到 App Store 时应用加载程序挂起
- cmake - 如何使用 cmake 生成 .out 文件?
- excel - Sumproduct sum 与单个单元格有效,但不适用于多个单元格
- android - 缺少 AndroidManifest.xml 尝试重新导入插件