【问题标题】:Pandas - Groupby with cumsum or cumcountPandas - Groupby 与 cumsum 或 cumcount
【发布时间】:2021-06-05 07:14:25
【问题描述】:

我有以下数据框:

       Vela    FlgVela  
0         R      0
1         V      1      
2         V      1      
3         R      1      
4         R      1
5         V      0
6         R      1
7         R      1
8         R      1

获得以下数据框结果的最佳方法是什么?

       Vela    FlgVela  AddCol
0         R      0         1
1         V      1         2
2         V      1         2
3         R      1         3
4         R      1         3
5         V      0         4
6         R      1         5
7         R      1         5
8         R      1         5
  

我尝试了以下逻辑,但结果不是我所期望的。

df['AddCol'] = df.groupby(df['Vela'].astype(str).str.strip() !=  df['Vela'].shift(-1).astype(str).str.strip() ).cumcount()+1

【问题讨论】:

  • 请说明附加栏的填写规则。
  • df['Vela'].astype(str).str.strip() 应该是完全没有必要的,这使得它很难阅读。这是一种代码气味,当您在数据帧中读取时,您处理了错误的数据类型、分隔符或空格,因此您得到了不需要的前导或尾随空格。修复您的 pd.read_csv() 设置。实际上,如果您将其转换为“字符串”,则 dtype 可能默认为“对象”而不是“字符串”,因此请指定 pd.read_csv(..., dtype={'Vela':str, ...})

标签: python pandas dataframe cumsum


【解决方案1】:

我想你已经接近了,这是一种方法:

df["AddCol"] = df.groupby("Vela").ngroup().diff().ne(0).cumsum()

我们首先得到每个不同的Vela 所属的组号(某种因式分解),然后取第一个差异,看看它们是否不等于 0。这将给出一个组的“转折点”给另一个。然后我们把它们累加起来,

得到

>>> df

  Vela  FlgVela  AddCol
0    R        0       1
1    V        1       2
2    V        1       2
3    R        1       3
4    R        1       3
5    V        0       4
6    R        1       5
7    R        1       5
8    R        1       5

【讨论】:

    【解决方案2】:

    无需对数据框进行分组。我们可以比较相邻的行来创建一个布尔掩码,然后在这个掩码上计算累积和来创建一个计数器

    df['AddCol'] = df['Vela'].ne(df['Vela'].shift()).cumsum()
    

      Vela  FlgVela  AddCol
    0    R        0       1
    1    V        1       2
    2    V        1       2
    3    R        1       3
    4    R        1       3
    5    V        0       4
    6    R        1       5
    7    R        1       5
    8    R        1       5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2022-01-25
      • 2019-05-05
      • 2019-07-18
      相关资源
      最近更新 更多