Python 熊猫数据帧中重复位置的频率

Python 熊猫数据帧中重复位置的频率,python,pandas,Python,Pandas,嗨,我正在努力找出以下数据框的重复位置: data = pd.DataFrame() data ['league'] =['A','A','A','A','A','A','B','B','B'] data ['Team'] = ['X','X','X','Y','Y','Y','Z','Z','Z'] data ['week'] =[1,2,3,1,2,3,1,2,3] data ['position']= [1,1,2,2,2,1,2,3,4] 我将比较前一行的位置数据,如果相同,我将分配一

嗨,我正在努力找出以下数据框的重复位置:

data = pd.DataFrame()
data ['league'] =['A','A','A','A','A','A','B','B','B']
data ['Team'] = ['X','X','X','Y','Y','Y','Z','Z','Z']
data ['week'] =[1,2,3,1,2,3,1,2,3]
data ['position']= [1,1,2,2,2,1,2,3,4]
我将比较前一行的位置数据,如果相同,我将分配一个。如果它与前一行不同,我将分配为1

我的预期结果如下:

这意味着我将分组(联赛、球队和周),并计算出频率。 有人能建议如何在熊猫身上做到这一点吗

谢谢

Zep

使用和配合:


使用groupby会给出全零,因为您是在组内而不是在整个数据帧上进行比较

data.groupby(['league', 'Team', 'week'])['position'].diff().fillna(0,downcast='infer')

0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0
8    0
Name: position, dtype: int64

使用
diff
,并与
0
进行比较:

v = df.position.diff()
v[0] = 0
df['frequency'] = v.ne(0).astype(int)

print(df)
  league Team  week  position  frequency
0      A    X     1         1          0
1      A    X     2         1          0
2      A    X     3         2          1
3      A    Y     1         2          0
4      A    Y     2         2          0
5      A    Y     3         1          1
6      B    Z     1         2          1
7      B    Z     2         3          1
8      B    Z     3         4          1

出于性能原因,您应该尽量避免调用
fillna

df = pd.concat([df] * 100000, ignore_index=True)

%timeit df['frequency'] = df['position'].diff().abs().fillna(0,downcast='infer')
%%timeit
v = df.position.diff()
v[0] = 0
df['frequency'] = v.ne(0).astype(int)

83.7 ms ± 1.55 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
10.9 ms ± 217 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

要将此答案扩展为在
分组中工作,请使用

v = df.groupby(['league', 'Team', 'week']).position.diff()
v[np.isnan(v)] = 0

df['frequency'] = v.ne(0).astype(int)

谢谢Sandeep。如果我想与联盟、球队、周进行分组,然后计算出频率,我将如何添加该频率。示例数据帧已排序,但实际数据是随机的。@coldspeed,如果simple
data['Freq']=data.position.diff().fillna(“0”)
@pygo simple但速度较慢,因此避免了。感谢coldspeed。如果第1周的位置必须为零,因为如果我们分组,它不会有任何以前的值,那么如何。我的意思是我正在跟踪从第一周开始的位置变化(这只是跟踪的开始)@Zephyr week 1默认为所有组的零(根据我对您问题的理解)。@coldspeed,将
v[0]=0分配为零是什么
v = df.groupby(['league', 'Team', 'week']).position.diff()
v[np.isnan(v)] = 0

df['frequency'] = v.ne(0).astype(int)