【问题标题】: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 中应用这个公式?

【问题讨论】:

    标签: python excel pandas dataframe sequence


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2021-04-05
      • 2016-12-29
      • 2021-03-26
      • 1970-01-01
      • 2015-08-05
      相关资源
      最近更新 更多