Python 熊猫自定义计数

Python 熊猫自定义计数,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,嘿,伙计们,我正在尝试累计计算按列用户分组的列值,但仅当两者之间存在不同值时才增加计数。 有人能帮我吗?我会非常感激的!因为我有点卡住了 我所能达到的最佳效果是使用以下方法获得正常的累积计数: df['Cumcount'] = df.groupby(['User', 'Value'].cumcount()+1 User Value Cumcount 0 A X 1 1 A X 2 2 A Y

嘿,伙计们,我正在尝试累计计算按列
用户
分组的列
,但仅当两者之间存在不同值时才增加计数。 有人能帮我吗?我会非常感激的!因为我有点卡住了

我所能达到的最佳效果是使用以下方法获得正常的累积计数:

df['Cumcount'] = df.groupby(['User', 'Value'].cumcount()+1

 User  Value     Cumcount
0      A      X       1
1      A      X       2
2      A      Y       1
3      A      X       3
4      A      Z       1
5      A      Y       2
6      B      X       1
7      B      Y       1
8      B      X       2
9      B      X       3
但我期望的结果是:

  User  Value     Cumcount
0      A      X       1
1      A      X       1
2      A      Y       1
3      A      X       2
4      A      Z       1
5      A      Y       2
6      B      X       1
7      B      Y       1
8      B      X       2
9      B      X       2

您可以设置两个条件来创建返回
True
False
的序列,并将其设置为
s

  • .duplicated()
    的第一个条件指示是否有任何行是重复的
  • 第二个条件执行一个
    .groupby('User')
    ,并获取
    .cumcount()
    并与您的版本进行比较,您的版本执行相同的操作,但通过
    用户
    。从本质上说,如果前者大于后者,这意味着两者之间存在价值
  • 1和2的组合返回
    布尔值
    系列s,如果将其作为列包含在数据帧中,则看起来是这样的:

    df['s'] = ((df.duplicated(subset=(['User', 'Value'])))
                 & (df.groupby('User').cumcount() + 1 > df['Cumcount']))
    
      User Value  Cumcount      s
    0    A     X         1  False
    1    A     X         2  False
    2    A     Y         1  False
    3    A     X         3   True
    4    A     Z         1  False
    5    A     Y         2   True
    6    B     X         1  False
    7    B     Y         1  False
    8    B     X         2   True
    9    B     X         3   True
    
    从那里,您可以对
    User
    和上面创建的系列
    s
    执行嵌套的
    .groupby().cumcount()+1
    。完整代码:

    s = ((df.duplicated(subset=(['User', 'Value'])))
           & (df.groupby('User').cumcount() + 1 > df['Cumcount']))
    df['Cumcount'] = df.groupby(['User', df.groupby(['User', s]).cumcount() + 1]).cumcount() + 1
    df
    Out[1]: 
      User Value  Cumcount
    0    A     X         1
    1    A     X         1
    2    A     Y         1
    3    A     X         2
    4    A     Z         1
    5    A     Y         2
    6    B     X         1
    7    B     Y         1
    8    B     X         2
    9    B     X         2
    

    您可以设置两个条件来创建返回
    True
    False
    的序列,并将其设置为
    s

  • .duplicated()
    的第一个条件指示是否有任何行是重复的
  • 第二个条件执行一个
    .groupby('User')
    ,并获取
    .cumcount()
    并与您的版本进行比较,您的版本执行相同的操作,但通过
    用户
    。从本质上说,如果前者大于后者,这意味着两者之间存在价值
  • 1和2的组合返回
    布尔值
    系列s,如果将其作为列包含在数据帧中,则看起来是这样的:

    df['s'] = ((df.duplicated(subset=(['User', 'Value'])))
                 & (df.groupby('User').cumcount() + 1 > df['Cumcount']))
    
      User Value  Cumcount      s
    0    A     X         1  False
    1    A     X         2  False
    2    A     Y         1  False
    3    A     X         3   True
    4    A     Z         1  False
    5    A     Y         2   True
    6    B     X         1  False
    7    B     Y         1  False
    8    B     X         2   True
    9    B     X         3   True
    
    从那里,您可以对
    User
    和上面创建的系列
    s
    执行嵌套的
    .groupby().cumcount()+1
    。完整代码:

    s = ((df.duplicated(subset=(['User', 'Value'])))
           & (df.groupby('User').cumcount() + 1 > df['Cumcount']))
    df['Cumcount'] = df.groupby(['User', df.groupby(['User', s]).cumcount() + 1]).cumcount() + 1
    df
    Out[1]: 
      User Value  Cumcount
    0    A     X         1
    1    A     X         1
    2    A     Y         1
    3    A     X         2
    4    A     Z         1
    5    A     Y         2
    6    B     X         1
    7    B     Y         1
    8    B     X         2
    9    B     X         2
    

    请提供一个。您是按用户和值分组的,请解释为什么索引1的预期结果应该是x1(再次)?请提供一个。您是按用户和值分组的,请解释为什么索引1的预期结果应该是x1(再次)?