我有一个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
如何使用内置的熊猫来实现。以某种方式创建任何帮助程序列以促进所提到的任务。
答案 0 :(得分:6)
在比较序列equals
B
和shift
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