Как использовать векторизованные вычисления в пандах, чтобы узнать, где меняется значение или категория с исправленной пPython

Программы на Python
Ответить
Anonymous
 Как использовать векторизованные вычисления в пандах, чтобы узнать, где меняется значение или категория с исправленной п

Сообщение Anonymous »

В наборе данных с миллионами записей у меня есть элементы с различными категориями и измерениями, и я пытаюсь выяснить, сколько записей изменилось, особенно когда категория или измерение переходит в NaN (или NULL из запрос к базе данных) во время последовательности.
В SQL я бы использовал для этого некоторые функции OLAP в стиле PARTITION, но кажется, что в Python с Pandas это должно быть довольно просто, но я могу Я не совсем понимаю, векторизованная нотация.
Я пробовал различные предложения df.groupby и лямбда-функции, но ничего не получалось в требуемом формате - в основном, df.groupby('item' )['measure'] в этом примере первая строка сгруппированного подмножества элемента и меры всегда возвращает True, где я бы хотел, чтобы это было False или NaN< /код>. Проще говоря, это ложные срабатывания. Я понимаю, что с точки зрения панд это изменение, поскольку первый x.shift() будет NaN, но я не могу понять, как это отфильтровать или обработать в лямбда-функции.Пример кода:

Код: Выделить всё

import pandas as pd
import numpy as np

test_df = pd.DataFrame({'item': [20, 20, 20, 20, 20, 20, 20, 20, 30, 30, 30, 30, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40 ],
'measure': [1, 1, 1, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10 ],
'cat': ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e']})

test_df['measure_change'] = test_df.groupby('item')['measure'].transform(lambda x: x.shift() != x)
test_df['cat_change'] = test_df.groupby('item')['cat'].transform(lambda x: x.shift() != x)
В выводе ниже, например, в строках 0, 8 и 16, значение Measure_change должно быть False. Таким образом, весь элемент 40 будет иметь значение Measure_change == False, и это будет указывать на отсутствие изменений в этом элементе. Любые предложения приветствуются.
(cat_change настраивается таким же образом)



#
элемент
мера
мера_изменения




0
20
1
Верно


1
< td>20
1
Ложь


2
201
Ложь


3
20
3
Верно


4
203
Ложь


5
20
3
Ложь


6
203
Ложь


7
20
3
Ложь


8
306
Верно


9
30
6
Ложь


10
306
Ложь


11
30
6
Ложь


12
306
Ложь


13
30
7
Верно


14
307
Ложь


15
30
7
Ложь


16
4010
Верно


17
40
10
Ложь


1840
10
Неверно


19
40
10
Неверно

20
40
10
Ложь


21
40
10
Неверно


22
40
10
Ложь


23
40
10
Ложь< /td>




Подробнее здесь: https://stackoverflow.com/questions/793 ... -or-catego
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»