выполнить поиск по фрейму данных на основе значения другого столбца - PullRequest
1 голос
/ 18 октября 2019

Иметь такой фрейм данных -

df = {'Request': [0, 0, 1, 0, 1, 0, 0],
 'Time': ['16:00', '17:00', '18:00', '19:00', '20:00', '20:30', '24:00'],
 'grant': [3, 0, 0, 5, 0, 0, 5]}

pd.DataFrame(df).set_index('Time')

    Out[16]: 
       Request  grant
Time                 
16:00        0      3
17:00        0      0
18:00        1      0
19:00        0      5
20:00        1      0
20:30        0      0
24:00        0      5

Значения в столбце «Запрос» являются логическими и обозначают, был ли сделан запрос или нет. 1 = запрос 0 = нет запроса. Значения в столбце «Предоставить» обозначают начальный размер предоставления.

Я хочу рассчитать время между запросом и грантом для каждого из запросов. Таким образом, в этом случае они будут 19:00 - 18:00 = 1 час и 24: 00-20: 00 = 4 часа. Есть ли способ легко выполнить эту операцию с большим набором данных с помощью панд?

Ответы [ 2 ]

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

Я бы сказал об этом примерно так:

df = {'Request': [0, 0, 1, 0, 1, 0, 0],
     'Time': ['16:00', '17:00', '18:00', '19:00', '20:00', '20:30', '24:00'],
     'grant': [3, 0, 0, 5, 0, 0, 5]}

df = pd.DataFrame(df) #create DataFrame

#get rid of any rows have neither a grant nor request
df = df[(df[['grant', 'Request']].T != 0).any()] 

#change the time in HH:MM to number of minutes
df['Time'] = df['Time'].str.split(":").apply(lambda x: int(x[0])*60 + int(x[1]))

#get the difference between those times
df['timeElapsed'] = df['Time'].diff()

#filter out the requests to only get the grants and their times. 
#Also, drop the NA from the first line.
df = df[(df[['grant']].T != 0).any()].dropna()

#drop all columns except timeElapsed and Grant
df = df[['timeElapsed', 'grant']]

, тогда результат будет выглядеть так: timeElaped в минутах:

   timeElapsed  grant
3         60.0      5
6        240.0      5
0 голосов
/ 18 октября 2019

Сначала нужно преобразовать индекс Time во что-то вычитаемое, чтобы найти дельту времени. Использование pd.to_timestamp не работает, потому что нет 24:00. В приведенном ниже решении используется десятичное время (13:30 = 13,5):

# Convert the index into decimal time
df.index = pd.to_timedelta(df.index + ':00') / pd.Timedelta(hours=1)

# Get time when each request was made
r = df[df['Request'] != 0].index.to_series()

# Get time where each grant was made
g = df[df['grant'] != 0].index.to_series()

# `asof` mean "get the last available value in `r` as the in `g.index`
tmp = r.asof(g)
df['Delta'] = tmp.index - tmp

Результат:

      Request  grant  Delta
Time                       
16.0        0      3    NaN
17.0        0      0    NaN
18.0        1      0    NaN
19.0        0      5    1.0
20.0        1      0    NaN
20.5        0      0    NaN
24.0        0      5    4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...