如何根据另一行对行进行排序?
Posted
技术标签:
【中文标题】如何根据另一行对行进行排序?【英文标题】:How to sequence row based on another row? 【发布时间】:2020-05-15 12:35:34 【问题描述】:我正在尝试将公式从 excel 转换为 pandas。
DataFrame 如下所示:
Column A Column B
H
H
H
J
J
J
J
K
K
我想填充 B 列以增加,而 A 列中的值保持不变。在上面的示例中,这将是:
Column A Column B
H 1
H 2
H 3
J 1
J 2
J 3
J 4
K 1
K 2
在 excel 中,公式为 =IF(A2<>A1,1,B1+1)
如何在 pandas 中应用这个公式?
【问题讨论】:
【参考方案1】:这可以使用以下矢量化方法来完成:
代码:
>>> df = pd.DataFrame('A':['H', 'H', 'H', 'J', 'J', 'J', 'J', 'K', 'K'])
>>> df['B'] = df.groupby((df['A'].shift(1) != df['A']).cumsum()).cumcount() + 1
输出:
>>> df
A B
0 H 1
1 H 2
2 H 3
3 J 1
4 J 2
5 J 3
6 J 4
7 K 1
8 K 2
说明:
首先,我们使用 df['A'].shift(1) != df['A']
将 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
接下来,我们使用cumsum()
返回该列的累积和。这给了我们:
>>> (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
现在,我们可以像往常一样使用GroupBy.cumcount()
来按升序枚举每个项目,加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
。
【讨论】:
以上是关于如何根据另一行对行进行排序?的主要内容,如果未能解决你的问题,请参考以下文章