首页 > 解决方案 > 按变量索引对数据框的一列进行分组

问题描述

我有一个数据框,它由 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

有什么解决方案可以解决这个优雅的问题吗?

标签: pythonpandas

解决方案


通过比较 bySeries.eq与累积总和来创建组Series.cumsum,然后按组聚合,例如 bysummax

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

推荐阅读