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

时间:2018-11-12 09:00:10

标签: 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]

我将比较上一行的位置数据,是否相同,我将分配一个。如果与前一行不同,我将分配为1

我的预期结果如下:

enter image description here

这意味着我将按(联赛,球队和周)分组并确定频率。 谁能建议在熊猫中做到这一点

谢谢

Zep

2 个答案:

答案 0 :(得分:1)

diffabsfillna一起使用:

data['frequency'] = data['position'].diff().abs().fillna(0,downcast='infer')

print(data)
  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

使用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

答案 1 :(得分:1)

使用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)

要扩展此答案使其适用于groupby,请使用

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

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