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

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

【讨论】:

以上是关于如何根据另一行对行进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 根据列中的最小值到最大值对行进行重新排序

通过根据提交历史对行进行排序来合并,而不是标记冲突

根据来自两个不同表的字段对行进行排序

如何根据多列对 flex 数据网格进行排序?

NetSuite - 对行项目进行排序

s-s-rS - 根据行数据的计算值对行集进行分组