Фрейм данных фильтрует столбец, если он относится к интервальному типу данных

#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 находится в интервале примера)