Получение индексов даты уникальных значений столбцов в пандах - PullRequest
0 голосов
/ 30 октября 2018

Учитывая DataFrame, который выглядит так:

                                contractID
Date                                      
1982-09-16  (SPZ1982, 1982-12-16 00:00:00)
1982-09-17  (SPZ1982, 1982-12-16 00:00:00)
1982-09-20  (SPZ1982, 1982-12-16 00:00:00)
                                   ...
2018-09-27  (SPZ2018, 2018-12-21 00:00:00)
2018-09-28  (SPZ2018, 2018-12-21 00:00:00)
2018-10-01  (SPZ2018, 2018-12-21 00:00:00)

У меня есть повторяющиеся contractID с, и я хочу эффективно выполнить операцию с этими идентификаторами, например:

def query(df, tup, startDate, endDate):
    ID = tup[0]
    ExpirationDate = tup[1]
    panel = df.loc[ID].loc[ExpirationDate].loc[startDate:endDate]
    return panel

df = pd.DataFrame()
print('acquiring daily data...')
for tup in contractUse['contractID'].unique():
    panel = query(rawData, tup, startDate, endDate)
    if df.empty:
        df = panel
    else:
        df = df.append(panel, verify_integrity=False)

return df

Где contractUse - датафрейм, представленный выше. Я только хочу перебрать уникальные значения. Когда я перебираю уникальные значения, мне нужно получить значение индекса, когда это уникальное значение началось, и значение индекса, когда это уникальное значение остановилось. Затем я передаю startDate и endDate уникального значения моей функции query. Есть ли быстрый способ сделать это в пандах?

1 Ответ

0 голосов
/ 30 октября 2018

Есть 2 вещи, которые нужно сделать:

  1. Не используйте серию кортежей. Разделите это на 2 отдельные серии.
  2. Используйте GroupBy, чтобы разбить ваш фрейм данных на куски в зависимости от столбца.

Итак, сначала разбейте вашу contractID серию:

df[['key', 'contract_date']] = pd.DataFrame(df.pop('contractID').values.tolist())

Затем сгруппируйте по недавно созданной серии key:

g = df.groupby('key')

Извлечение индексов «начало и конец» для группы теперь так же просто, как извлечение группы и просмотр ее индекса. Например:

idx_start, idx_end = g.get_group('SPZ1982').index[[0, -1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...