我有一个由 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
有什么办法可以解决这个优雅的问题吗?
最佳答案
通过比较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
关于python - 按变量索引对数据帧的一列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57336873/