按变量索引将一列数据框分组

时间:2019-08-03 08:55:49

标签: python pandas

我有一个由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

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

1 个答案:

答案 0 :(得分:3)

通过比较Series.eq与累积总和Series.cumsum来创建组,然后按组进行汇总,例如通过summax

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