根据条件对熊猫系列进行分组

时间:2020-04-19 14:21:09

标签: python pandas dataframe grouping

我有一个Pandas df,其中一栏具有以下值。

      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

如何使用内置的熊猫来实现。以某种方式创建任何帮助程序列以促进所提到的任务。

3 个答案:

答案 0 :(得分:6)

在比较序列equals Bshift 1个位置是否将B包括在组中之后,您可以尝试cumsum

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

答案 1 :(得分:2)

IIUC,请注意这里的团体正在下降。但是如果只需要按数据分组,则输出应该相同

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

答案 2 :(得分: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