Python 按组运行重复值计数
我是熊猫的新手,遇到了麻烦,非常感谢您的帮助 我有以下数据集:Python 按组运行重复值计数,python,pandas,dataframe,Python,Pandas,Dataframe,我是熊猫的新手,遇到了麻烦,非常感谢您的帮助 我有以下数据集: pd.DataFrame(np.array([[1,1,320], [1,1,320], [1,1,320], [1,1,320], [1,1,319], [1,1,319], [1,1,319], [1,1,319], [1,2,319], [1,2,319], [1,2,319]]), columns = ['PortID', 'FuelGroupID', 'Price']) PortID FuelGroupID
pd.DataFrame(np.array([[1,1,320], [1,1,320], [1,1,320], [1,1,320], [1,1,319], [1,1,319], [1,1,319], [1,1,319], [1,2,319], [1,2,319], [1,2,319]]), columns = ['PortID', 'FuelGroupID', 'Price'])
PortID FuelGroupID Price
0 1 1 320
1 1 1 320
2 1 1 320
3 1 1 320
4 1 1 319
5 1 1 319
6 1 1 319
7 1 1 319
8 1 2 319
9 1 2 319
10 1 2 319
对于每个PortID和FuelGroupID,我都在尝试有一个重复值的运行计数——如果值发生变化,该计数应该中断
我已经能够通过使用以下代码实现计数:
df.groupby((df['Price'] != df['Price'].shift(1)).cumsum()).cumcount()
但是,这将逻辑应用于整个数据集,同时我希望为PortID和FuelGroupID的每个新组合重置计数
因此,预期的输出应该是
PortID FuelGroupID Price Count
0 1 1 320 0
1 1 1 320 1
2 1 1 320 2
3 1 1 320 3
4 1 1 319 0
5 1 1 319 1
6 1 1 319 2
7 1 1 319 3
8 1 2 319 0
9 1 2 319 1
10 1 2 319 2
非常感谢您的帮助您很接近了,因为您希望按照
PortID
和FuelGroupID
工作,所以您应该将代码包装在一个groupby中:
groups = df.groupby(['PortID','FuelGroupID'])['Price']
group1 = groups.ngroup()
group2 = groups.apply(lambda x: x.diff().ne(0).cumsum())
df['new_col'] = df.groupby([group1, group2]).cumcount()
输出:
PortID FuelGroupID Price new_col
0 1 1 320 0
1 1 1 320 1
2 1 1 320 2
3 1 1 320 3
4 1 1 319 0
5 1 1 319 1
6 1 1 319 2
7 1 1 319 3
8 1 2 319 0
9 1 2 319 1
10 1 2 319 2
您可以使用,也可以在此处使用和
谢谢你的建议。第8行的计数应重新设置为FuelGroupIDchanges@Anton1990谢谢你指出这一点。更新了答案。谢谢你这个代码的作品;我将另一个解决方案标记为用更少的代码行解决了问题。
s = df.ne(df.shift()).any(axis=1).cumsum()
# s = np.not_equal(df, df.shift()).any(axis=1).cumsum()
df['Count'] = s.groupby(s).cumcount()
PortID FuelGroupID Price Count
0 1 1 320 0
1 1 1 320 1
2 1 1 320 2
3 1 1 320 3
4 1 1 319 0
5 1 1 319 1
6 1 1 319 2
7 1 1 319 3
8 1 2 319 0
9 1 2 319 1
10 1 2 319 2