Установить значения столбца на основе поиска из другого столбца - PullRequest
0 голосов
/ 19 октября 2019

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

Набор данных довольно большой, и я представляю, что есть лучшее решение, чем грубое форсирование этого с помощью петель, которое кто-то лучше знает с Пандами!

Итак, короче, если я создаммой набор данных вот так:

import pandas as pd

#create example dataset
data = {'categories':['a','b','c']*4,'dates':[i for i in range(4) for j in range(3)],'event':[0]*3*4}

#add a couple of events
data['event'][4] = 1
data['event'][9] = 1

df = pd.DataFrame(data)


Как мне лучше всего получить вывод, похожий на этот?

   categories  dates  event  time_until
0           a      0      0           3
1           b      0      0           1
2           c      0      0          -1
3           a      1      0           2
4           b      1      1           0
5           c      1      0          -1
6           a      2      0           1
7           b      2      0          -1
8           c      2      0          -1
9           a      3      1           0
10          b      3      0          -1
11          c      3      0          -1

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 19 октября 2019

Использование groupby

def f(s):
    s = s.reset_index(drop=True)
    one = s[s.eq(1)]
    if one.empty: return -1
    return -s.index + one.index[0]

df.groupby('categories').event.transform(f)

  categories  dates  event  time_until
0           a      0      0           3
1           b      0      0           1
2           c      0      0          -1
3           a      1      0           2
4           b      1      1           0
5           c      1      0          -1
6           a      2      0           1
7           b      2      0          -1
8           c      2      0          -1
9           a      3      1           0
10          b      3      0          -2
11          c      3      0          -1

Обратите внимание, что это находит расстояние даже после того, как событие произошло. Таким образом, для следующего события вы получите следующий вывод

event = [0, 0, 0, 1, 0, 0]
until = [3, 2, 1, 0, -1, -2]

Если вам нужно увековечить все отрицательные значения с помощью -1, просто настройте в конце

df.time_until.where(df.time_until >= -1, -1)
0 голосов
/ 19 октября 2019

Альтернативное решение:

df.sort_values(by=['categories', 'dates'], ascending=[True, False], inplace=True)
df['tmp'] = df.groupby('categories')['event'].transform('cumsum')
df['time_until'] = df.groupby('categories')['tmp'].transform('cumsum') - 1
df.drop(columns='tmp', inplace=True)
df.sort_values(by=['dates', 'categories'], ascending=[True, True], inplace=True)

Вывод:

      categories  dates  event  time_until
0           a      0      0           3
1           b      0      0           1
2           c      0      0          -1
3           a      1      0           2
4           b      1      1           0
5           c      1      0          -1
6           a      2      0           1
7           b      2      0          -1
8           c      2      0          -1
9           a      3      1           0
10          b      3      0          -1
11          c      3      0          -1
0 голосов
/ 19 октября 2019

Попробуйте что-то вроде этого:

import pandas as pd
import numpy as np

data = {'categories':['a','b','c']*4,
        'dates':[i for i in range(4) for j in range(3)],
        'event':[0, 1, 0]*4}

df = pd.DataFrame(data)
print(df)

# One way
df.loc[df.event == 0, 'Newevents'] = 'Cancelled'
df.loc[df.event != 0, 'Newevents'] = 'Scheduled'

# Another way
conditions = [
    (df['categories'] == "a"),
    (df['categories'] == "b"),
    (df['categories'] == "c")]
choices = ['None', 'Completed', 'Scheduled']
df['NewCategories'] = np.select(conditions, choices, default='black')
print(df)

ВЫХОД:

categories  dates  event
0           a      0      0
1           b      0      1
2           c      0      0
3           a      1      0
4           b      1      1
5           c      1      0
6           a      2      0
7           b      2      1
8           c      2      0
9           a      3      0
10          b      3      1
11          c      3      0
categories  dates  event  Newevents NewCategories
0           a      0      0  Cancelled          None
1           b      0      1  Scheduled     Completed
2           c      0      0  Cancelled     Scheduled
3           a      1      0  Cancelled          None
4           b      1      1  Scheduled     Completed
5           c      1      0  Cancelled     Scheduled
6           a      2      0  Cancelled          None
7           b      2      1  Scheduled     Completed
8           c      2      0  Cancelled     Scheduled
9           a      3      0  Cancelled          None
10          b      3      1  Scheduled     Completed
11          c      3      0  Cancelled   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...