Частота повторяющихся позиций в кадре данных панд - PullRequest
0 голосов
/ 12 ноября 2018

Привет. Я работаю над поиском повторяющейся позиции следующего фрейма данных:

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

Это означает, что я сгруппируюсь (Лига, Команда и неделя) и определю частоту. Может кто-нибудь посоветовать, как это сделать в Pandas

Спасибо

Zep

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Используйте 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)
0 голосов
/ 12 ноября 2018

Использование diff и abs с fillna:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...