Python 如何根据另一行对行排序?

Python 如何根据另一行对行排序?,python,excel,pandas,dataframe,sequence,Python,Excel,Pandas,Dataframe,Sequence,我正在尝试将一个公式从excel转换为pandas 数据帧如下所示: Column A Column B H H H J J J J K K 我希望在A列中的值保持不变的情况下,将B列填充为增量。在上述示例中,这将是: Column A Column B H 1 H 2 H 3 J 1 J 2 J 3 J

我正在尝试将一个公式从excel转换为pandas

数据帧如下所示:

Column A    Column B 
H  
H  
H  
J  
J  
J  
J  
K  
K  
我希望在A列中的值保持不变的情况下,将B列填充为增量。在上述示例中,这将是:

Column A     Column B
H            1
H            2
H            3
J            1
J            2
J            3
J            4
K            1
K            2
在excel中,公式为=IFA2A1,1,B1+1


如何在熊猫中应用此公式?

可以使用以下矢量化方法:

代码:

输出:

说明:

首先,我们使用将列A与移位1的列A进行比较。这将产生:

>>> df['A'] != df['A'].shift(1)
0     True
1    False
2    False
3     True
4    False
5    False
6    False
7     True
8    False
Name: A, dtype: bool
接下来,我们使用返回该列的累积和。这给了我们:

>>> (df['A'] != df['A'].shift(1)).cumsum()
0    1
1    1
2    1
3    2
4    2
5    2
6    2
7    3
8    3
Name: A, dtype: int32
现在,我们可以像往常一样按升序枚举每个项,添加1以从1开始索引。请注意,我们不能只使用

df.groupby('A').cumcount()
因为,例如,如果我们有:

>>> df
   A
0  H
1  H
2  H
3  J
4  J
5  J
6  J
7  K
8  K
9  H
这将使我们:

>>> df.groupby('A').cumcount() + 1
0    1
1    2
2    3
3    1
4    2
5    3
6    4
7    1
8    2
9    4
dtype: int64
请注意,最后一行是4,而不是预期的1

>>> df
   A
0  H
1  H
2  H
3  J
4  J
5  J
6  J
7  K
8  K
9  H
>>> df.groupby('A').cumcount() + 1
0    1
1    2
2    3
3    1
4    2
5    3
6    4
7    1
8    2
9    4
dtype: int64