Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按组运行重复值计数_Python_Pandas_Dataframe - Fatal编程技术网

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