Numpy выбрать для большого количества условий и вариантов (l oop)? - PullRequest
0 голосов
/ 09 июля 2020

Итак, у меня есть исходный фрейм данных pandas с примерно 300 000 временных меток и еще один с 1000 временных интервалов (два столбца, один с началом и один с остановкой). Я хочу создать новый столбец в исходном фрейме данных, где каждому значению столбца присваивается номер в зависимости от того, была ли найдена временная метка строки в пределах указанного c временного интервала (число должно быть значением индекса временного интервала). Значения столбцов временных меток, которые не найдены ни в одном временном интервале, должны быть установлены на NaN.

Вот что я сделал до сих пор:

conditions = [
    (Stamps['date_time_utc'] >= Intervals['Start'][0]) & (Stamps['date_time_utc'] <= Intervals['Stop'][0]),
    (Stamps['date_time_utc'] >= Intervals['Start'][1]) & (Stamps['date_time_utc'] <= Intervals['Stop'][1]),
    (Stamps['date_time_utc'] >= Intervals['Start'][2]) & (Stamps['date_time_utc'] <= Intervals['Stop'][2])
]

choices = [0,1,2]

Stamps['Interval ID'] = np.select(conditions, choices, default=np.NaN)

Stamps['Interval ID'].value_counts()

Output:
2.0    942
0.0    617
1.0    525
Name: Interval ID, dtype: int64

Это работает как надо . Проблема в том, что когда у меня есть тысяча временных интервалов, я, очевидно, не хочу выписывать условие для каждого из них. Это то, что я пробовал, но безуспешно:

Stamps['Interval ID'] = np.NaN

for idx, i in enumerate(zip(Intervals['Start'],Intervals['Stop'])):
    conditions = [
        (Stamps['date_time_utc'] >= i[0]) & (Stamps['date_time_utc'] <= i[1]),
    ]
    choices = [idx]
Stamps['Interval ID'] = np.select(conditions, choices, default=NaN)

FYI Times в обоих фреймах данных имеет dtype: object.

Как я могу сделать это эффективным и понятным способом?

...