熊猫定制货币

时间:2020-09-22 23:00:55

标签: python pandas dataframe pandas-groupby

嘿,我正在尝试对Value分组的User列进行累加计数,但是只有在两者之间有不同的值时才增加计数。 有人可以帮我吗?我真的很感激!因为我有点卡住。.

我能达到的最好成绩是使用以下设备进行正常的计数:

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

1 个答案:

答案 0 :(得分:0)

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

  1. 带有.duplicated()的第一个条件表示任何行是否重复。
  2. 第二个条件执行一个.groupby('User')并使用.cumcount()并与您的版本进行比较,但版本相同,但分别为UserValue。本质上,如果前者大于后者,则意味着两者之间存在价值。

1和2的组合返回boolean系列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

您可以在此处创建.groupby().cumcount() + 1的嵌套User和上面创建的系列s。完整代码:

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