按条件分组 Pandas 系列数据

4

我有一个带有一个列的Pandas数据框,其包含以下值。

      Data
0      A
1      A 
2      B
3      A
4      A 
5      A
6      B
7      A
8      A
9      B

我希望尝试将这些值分组,对于每次出现的B值,我想将分组值更改如下。
      Data  Group
0      A      1
1      A      1
2      B      1
3      A      2
4      A      2
5      A      2
6      B      2
7      A      3
8      A      3
9      B      3

如何使用pandas内置函数实现此功能。可以通过创建辅助列来实现所述任务。
3个回答

6
你可以在比较序列是否等于B后尝试使用cumsum,然后将其shift 1个位置以包括B在组内:
df['Data'].eq('B').shift(fill_value=False).cumsum().add(1)

0    1
1    1
2    1
3    2
4    2
5    2
6    2
7    3
8    3
9    3

2
我注意到这里的组正在下降。但是,如果您只需要按数据拆分组,则输出应该是相同的:
s=df.Data.eq('B').iloc[::-1].cumsum()
s
9    1
8    1
7    1
6    2
5    2
4    2
3    2
2    3
1    3
0    3
Name: Data, dtype: int64

1
你还可以使用 pandas.core.groupby.GroupBy.cumcount()pandas.DataFrame.bfill() 方法结合使用,如下所示。
>>> df['Group'] = (df[df.Data == 'B'].groupby('Data').Data.cumcount() + 1)
>>> df['Group'] = df.Group.bfill()
>>> print(df)
  Data  Group
0    A    1.0
1    A    1.0
2    B    1.0
3    A    2.0
4    A    2.0
5    A    2.0
6    B    2.0
7    A    3.0
8    B    3.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接