python - 按变量索引对数据框的一列进行分组
问题描述
我有一个数据框,它由 PartialRoutes (它们一起产生完整的路线)和一个处理变量组成,我试图通过将它们组合在一起并保持处理变量来将数据框减少到完整的路线。
为了更清楚地说明这一点,df 看起来像
PartialRoute Treatment
0 1
1 0
0 0
0 0
1 0
2 0
3 0
0 0
1 1
2 0
“部分路由”中的每个 0 都会启动一个新组,这意味着我总是想对所有值进行分组,直到新路由开始/索引中的新 0。所以在这个例子中存在 4 个组
PartialRoute Treatment
0 1
1 0
-----------------
0 0
-----------------
0 0
1 0
2 0
3 0
-----------------
0 0
1 1
2 0
-----------------
结果应该看起来像
Route Treatment
0 1
1 0
2 0
3 1
有什么解决方案可以解决这个优雅的问题吗?
解决方案
通过比较 bySeries.eq
与累积总和来创建组Series.cumsum
,然后按组聚合,例如 bysum
或max
:
df1 = df.groupby(df['PartialRoute'].eq(0).cumsum())['Treatment'].sum().reset_index()
print (df1)
PartialRoute Treatment
0 1 1
1 2 0
2 3 0
3 4 1
详情:
print (df['PartialRoute'].eq(0).cumsum())
0 1
1 1
2 2
3 3
4 3
5 3
6 3
7 4
8 4
9 4
Name: PartialRoute, dtype: int32
如果第一个值DataFrame
没有0
得到不同的组 - 从0
:
print (df)
PartialRoute Treatment
0 1 1
1 1 0
2 0 0
3 0 0
4 1 0
5 2 0
6 3 0
7 0 0
8 1 1
9 2 0
print (df['PartialRoute'].eq(0).cumsum())
0 0
1 0
2 1
3 2
4 2
5 2
6 2
7 3
8 3
9 3
Name: PartialRoute, dtype: int32
df1 = df.groupby(df['PartialRoute'].eq(0).cumsum())['Treatment'].sum().reset_index()
print (df1)
PartialRoute Treatment
0 0 1
1 1 0
2 2 0
3 3 1
推荐阅读
- vba - 为已合并的 2 个私有子定义一个范围
- javascript - 如何使用 javascript 查找内部对象?
- symfony - Symfony 分析器无法更改面板
- windows - 为什么我的消息框看起来与 Windows 10 显示的不同?
- excel - vba 打开文件夹中最近的文件
- java - 空手道条件后台执行
- python - 如何从 json-rpc 传递值并让 python 读取它
- javascript - 如何根据angular6中的用户输入过滤列表中的数据?
- ubuntu - 尝试使用 systemd 在 ubuntu 服务器上运行 apache 气流
- c++ - 将 std::vector 与包含在单独文件中定义的特征类型的类/结构一起使用时出现问题