【问题标题】:Pandas creating new column based on consecutive duplicates熊猫根据连续重复创建新列
【发布时间】:2021-09-11 06:10:49
【问题描述】:

我有一个如下所示的 Pandas 数据框,其中 A 列是一系列字符串,B 列中的值是真/假,具体取决于 A 列的值是否与上一行。

A    B       
1    False          
1    True             
1b   False          
1b   True                
1b   True    
1    False    

我想添加一个新列 C,它为所有 连续重复 条目分配相同的值(可以是任何值),但该值必须不同于分配给其他条目的值连续重复条目的组。例如:

A    B        C
1    False    1       
1    True     1         
1b   False    2         
1b   True     2            
1b   True     2
1    False    3

关于如何以有效的方式解决这个问题有什么想法吗?

【问题讨论】:

  • 我认为cumsum(!df["B"]) 会让你非常接近
  • 这行得通,我将 B 列更改为将 False 映射为 1,将 True 映射为 0。之后我运行 df["C"] = df["B"].cumsum() 来获取所需的输出。谢谢!

标签: python pandas numpy boolean shift


【解决方案1】:

尝试使用groupby ngroup + 1 确保sort=False 以确保按照它们在DataFrame中出现的顺序创建组:

df['C'] = df.groupby(['A', (~df['B']).cumsum()], sort=False).ngroup() + 1
    A      B  C
0   1  False  1
1   1   True  1
2  1b  False  2
3  1b   True  2
4  1b   True  2
5   1  False  3

或者如果值以cumsum的排序顺序出现,则可以直接使用以下任一方法:

df['C'] = (~df['B']).cumsum()
    A      B  C
0   1  False  1
1   1   True  1
2  1b  False  2
3  1b   True  2
4  1b   True  2
5   1  False  3

这相当于:

df['A'].ne(df['A'].shift()).cumsum()
0    1
1    1
2    2
3    2
4    2
5    3
Name: A, dtype: int32

如果尚未计算 B 列,这将是解决此问题的标准方法。

【讨论】:

    【解决方案2】:

    尝试与shift 结合使用cumsum

    df['C'] = df.A.ne(df.A.shift()).cumsum()
    Out[191]: 
    0    1
    1    1
    2    2
    3    2
    4    2
    5    3
    Name: A, dtype: int64
    

    【讨论】:

      【解决方案3】:

      我想这就是你要找的。​​p>

      df['C'] = df.groupby('A').ngroup() + 1
      

      【讨论】:

        猜你喜欢
        • 2019-01-23
        • 1970-01-01
        • 2020-07-07
        • 2021-11-25
        • 2022-08-09
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        相关资源
        最近更新 更多