Посчитать прошлые записи с тем же ключом

1

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

Я хотел бы подсчитать для каждой записи только те, где Date меньше. Что-то вроде: подсчитайте все записи, в которых идентификатор один и те же, и укажите дату <= дату текущей строки и добавьте столбец с этим значением.

ID | Date   | 
1  | 3/4/10 |
1  | 3/6/10 |
1  | 1/2/10 |
2  | 5/5/10 |
2  | 5/6/10 |

Результат

ID | Date   | Total
1  | 3/4/10 | 1
1  | 3/6/10 | 2
1  | 1/2/10 | 0
2  | 5/5/10 | 0
2  | 5/6/10 | 1

Большое спасибо!

Теги:
python-3.x

3 ответа

0
Лучший ответ

Предполагая, что вы используете Pandas, сначала измените столбец Date на datetime затем отсортируйте по ID затем Date:

df = pd.DataFrame({'ID':[1,1,1,2,2], 'Date':['3/4/10','3/6/10','1/2/10','5/5/10','5/6/10']})
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(['ID','Date'])

Теперь подсчитайте число Date d на ID, сделайте счетчик np.arange с np.arange и конвертируйте в pd.Series. Уложите результаты и вуаля:

df['Total'] = (df
                .groupby('ID')
                .count()['Date']
                .apply(np.arange)
                .apply(pd.Series)
                .stack()  
                .values)  


print(df.sort_index())
        Date  ID  Total
0 2010-03-04   1    1.0
1 2010-03-06   1    2.0
2 2010-01-02   1    0.0
3 2010-05-05   2    0.0
4 2010-05-06   2    1.0
1

Вот упрощенный псевдокод, который может быть реализован либо с помощью itertools либо с помощью pandas:

  • Группировать набор данных по столбцу ID
  • Для каждой группы:
    • сортировать столбец Date
    • Total столбец - порядковый номер даты.
1

определите функцию для проверки даты. используйте, например.

def DateOrderChecker(input):
truncatedInput = input[:n]
trunflip = truncatedInput.reverse()
trunFinal = (trunflip[:v]).reverse()

где n - char. в конце даты, а v - раньше. так что вы останетесь с "5/5/10"

теперь делай

month, day, year = trunFinal.split("/")

и, наконец, введите строку if для сравнения (год/месяц/день) <(HeldMonth/HeldDay/Heldyear)

рейтинг важности год> месяц> день

Ещё вопросы

Сообщество Overcoder
Наверх
Меню