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,如果simpledata['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)