【问题标题】:Integer Counter when value in next row changes下一行中的值更改时的整数计数器
【发布时间】:2021-06-09 13:25:32
【问题描述】:

在我的数据框中添加“计数器列”时遇到问题。

我将多个列中的值解析为所谓的“merged_attributes”,现在我想创建一个计数器,当“合并属性”列的值发生变化时,该计数器递增 1。

我有以下数据框,最后一列是所需的列:

   Price  UNIQUE  MERGED_ATRIBUTE  COUNTER
0  52.08       1           52.081        1
1  52.08       1           52.081        1
2  52.20       1           52.210        2
3  52.20       1           52.210        2
4  52.20       1           52.210        2
5  52.20       1           52.210        2
6  52.20       1           52.210        2
7  52.20       1           52.210        2
8  70.10       1           70.110        3

我如何做到这一点?

非常感谢!

【问题讨论】:

    标签: pandas cumsum


    【解决方案1】:

    或使用cumsum() 并与前一行进行相等性检查:

    c = df['MERGED_ATRIBUTE']
    df['COUNTER'] = c.ne(c.shift()).cumsum()
    

       Price  UNIQUE  MERGED_ATRIBUTE  COUNTER
    0  52.08       1           52.081        1
    1  52.08       1           52.081        1
    2  52.20       1           52.210        2
    3  52.20       1           52.210        2
    4  52.20       1           52.210        2
    5  52.20       1           52.210        2
    6  52.20       1           52.210        2
    7  52.20       1           52.210        2
    8  70.10       1           70.110        3
    

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      df['COUNTER'] = df.groupby('MERGED_ATRIBUTE').ngroup() + 1
      

      这会为MERGED_ATRIBUTE 的每个值创建一个组,然后使用GroupBy.ngroup

      将每个组编号从 0 到组数 - 1。

      这将返回以下 DataFrame:

         Price  UNIQUE  MERGED_ATRIBUTE  COUNTER
      0  52.08       1           52.081        1
      1  52.08       1           52.081        1
      2  52.20       1           52.210        2
      3  52.20       1           52.210        2
      4  52.20       1           52.210        2
      5  52.20       1           52.210        2
      6  52.20       1           52.210        2
      7  52.20       1           52.210        2
      8  70.10       1           70.110        3
      

      请注意,这为每个属性分配了一个唯一的编号,因此如果 MERGED_ATRIBUTE 未排序,则此答案与 @sophocles 的答案不同:

      >>> df2
         Price  UNIQUE  MERGED_ATRIBUTE
      0  52.08       1           52.081
      1  70.10       1           70.110
      2  52.08       1           52.081
      >>> df2.groupby('MERGED_ATRIBUTE').ngroup() + 1
      0    1
      1    2
      2    1
      dtype: int64
      >>> df2['MERGED_ATRIBUTE'].ne(df2['MERGED_ATRIBUTE'].shift()).cumsum()
      0    1
      1    2
      2    3
      Name: MERGED_ATRIBUTE, dtype: int64
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多