我有一个由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
有什么解决方案可以解决这个问题吗?
答案 0 :(得分:3)
通过比较Series.eq
与累积总和Series.cumsum
来创建组,然后按组进行汇总,例如通过sum
或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