#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть массив фреймов данных, который включает в себя некоторый столбец, и один из них — ‘time’, я хочу отфильтровать строки, время которых находится в определенном интервале
Чтобы упростить проблему, я создаю фрейм данных с целочисленным значением и целочисленным интервалом
data=pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9]})
interval=pd.Interval(1,4)
data[data['A'] in interval]
Он показывает:
Ошибка значения: значение истинности ряда неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all().
но ожидаемый результат [2,3,4]
Комментарии:
1. в настоящее время в pandas нет встроенного способа сделать это, но есть то, что в конечном итоге будет добавлено (пока нет окончательной временной шкалы)
Ответ №1:
between
pandas.Series.between
вернет логическую маску, которую можно использовать для фильтрации фрейма данных.
data[data.A.between(1, 4)]
A
0 1
1 2
2 3
3 4
query
pandas.DataFrame.query
также может использоваться для фильтрации
data.query('1 <= A <= 4')
A
0 1
1 2
2 3
3 4
isin
pandas.Series.isin
может использоваться в специальном целочисленном случае с помощью range
. Аналогично between
мы создаем логическую маску.
data[data.A.isin(range(1, 5))]
A
0 1
1 2
2 3
3 4
Комментарии:
1. Спасибо, но есть ли какая-либо возможность использовать интервал в функции?
2. Насколько я знаю, нет.
pandas.Interval
предназначен для представления хэшируемой вещи, которая может представлять категорию. Он используется для разделения данных на сегменты, где каждый сегмент представлен интервалом. Затем мы можем использовать эти интервалы в качестве индексов. Конечно, разработчики Pandas могут изменить это, чтобы соответствовать такого рода вещам, но я сомневаюсь, что они это сделают.3. Что вы думаете о
data[data.A.apply(lambda x : x in interval)]
это хороший способ?4. Это умно, но медленно, учитывая
apply
. Более понятный способ сделать то же самое, но также не рекомендуетсяdata[data.A.map(interval.__contains__)]
илиdata[[*map(interval.__contains__, data.A)]]
5. таким образом,
between
иisin
примеры в целом не совсем верны:between
не обрабатывает смешанные неравенства (т. Е. в примере интервал открыт справа и закрыт слева), иisin
пример не обрабатывает дробные значения (т. Е. 1,5 находится в интервале примера)
Ответ №2:
Используя ваш interval
data.loc[(data.A>=interval.left) amp; (data.A<interval.right)]
Out[245]:
A
0 1
1 2
2 3
3 4
Ответ №3:
Используйте Series.between
:
s = data[data.A.between(interval.left 1, interval.right)]
print(s)
A
1 2
2 3
3 4
Или используя Boolean indexing
:
l = data[(data.A > interval.left) amp; (data.A <= interval.right)]
print(l)
A
1 2
2 3
3 4
Комментарии:
1. Спасибо, но есть ли какая-либо возможность использовать интервал в функции?
2.
between
в целом не совсем работает, поскольку не обрабатывает смешанные неравенства (т. Е. в примере интервал открыт справа и закрыт слева); добавление 1 к открытой конечной точке не учитывает дробные значения (т. Е. 1.1 находится в интервале примера)