Отслеживание положения элемента в строках с помощью панд

Я работаю над анализом спорта, особенно футбола, Я рассчитываю недельный рейтинг команд. Я хочу отслеживать изменения их положения. Вот мои образцы данных, которые повторяют мою проблему.

df = pd.DataFrame()
df ['Season'] = ['1314','1314','1314','1314','1314','1314','1314','1314','1314','1415','1415','1415','1415','1415','1415','1415','1415','1415']
df ['Team'] = ['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C']
df ['GW'] = [1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3]
df['Position'] = [1,2,3,3,1,2,2,3,1,2,1,3,2,1,3,3,2,1]

ТАК у меня есть все еженедельные позиции и т.д. Чтобы отслеживать изменения позиции, я сначала отсортирую фрейм данных следующим образом:

df = df.sort_values (['Season','Team'])

после сортировки я применяю функцию diff(), чтобы получить изменение следующим образом:

v = df.Position.diff()
v[0] = 0
df ['Position_change']= v

Я хотел отслеживать изменения для каждого GW. В моем кадре данных у меня есть 3 GW. Я хочу, чтобы все GW1 для каждой команды были равны 0 при смене позиции. Вторая проблема заключается в том, что изменения вносятся между двумя командами (чего я не хочу), если я использую diff(). Вы можете увидеть на прикрепленной картинке: Отслеживание положения элемента в строках с помощью панд

Может ли кто-нибудь дать совет по этому поводу?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ИИУК, вам нужно:

df['Position_Change']=df.groupby(['Season','Team'])['Position'].apply(lambda x : x.diff().fillna(0))
print(df)

   Season Team  GW  Position  Position_Change
0    1314    A   1         1         0.0
3    1314    A   2         3         2.0
6    1314    A   3         2        -1.0
1    1314    B   1         2         0.0
4    1314    B   2         1        -1.0
7    1314    B   3         3         2.0
2    1314    C   1         3         0.0
5    1314    C   2         2        -1.0
8    1314    C   3         1        -1.0
9    1415    A   1         2         0.0
12   1415    A   2         2         0.0
15   1415    A   3         3         1.0
10   1415    B   1         1         0.0
13   1415    B   2         1         0.0
16   1415    B   3         2         1.0
11   1415    C   1         3         0.0
14   1415    C   2         3         0.0
17   1415    C   3         1        -2.0

Если я хочу создать новый столбец, в котором команда, занявшая позицию 1, станет «чемпионом». Как я мог это сделать?

Zephyr 18.01.2019 14:22

я думаю, что-то вроде df['new_col']=np.where((df.Position ==1),'Champion','')?

anky 18.01.2019 14:23

Позвольте мне привести вам пример

Zephyr 18.01.2019 14:24

@Zephyr, если это отдельный вопрос, было бы лучше, если бы вы разместили вопрос, я бы ответил на них. :)

anky 18.01.2019 14:25

В порядке. Я опубликую через несколько минут.

Zephyr 18.01.2019 14:25

Спасибо. Только что отправил.

Zephyr 18.01.2019 14:41

Другие вопросы по теме