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()
并与您的版本进行比较,您的版本执行相同的操作,但通过用户
和值
。从本质上说,如果前者大于后者,这意味着两者之间存在价值布尔值
系列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()
并与您的版本进行比较,您的版本执行相同的操作,但通过用户
和值
。从本质上说,如果前者大于后者,这意味着两者之间存在价值布尔值
系列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(再次)?