2013-10-09 3 views
2

у меня есть dataframe, который выглядит примерно так:conditionly выбор части dataframe строк

In [75]: 

x.head() 
Out[75]: 
     start end phone 
    0  0  1600 /
    1  1600 1660 p 
    2  1660 1720 e 
    3  1720 1780 n 
    4  1780 1850 e 

Теперь у меня есть стартовый номер и конечный номер, и я хочу, чтобы выбрать все строки между этими числами , Например, для start = 0 и end = 1720 я получу первые три строки.

Я попытался наивным образом:

x[x.start==0:x.end==1720] 

, но конечно, что техника его подводит работал. громоздкий способ действительно работал:

s = x[x.start==0].index 
e = x[x.end==1720].index 
x[s:e] 

Вопрос в том, что в большинстве случаев это более элегантный способ сделать это. Проблема с пандами, как я ее вижу, заключается в том, что я не могу догадаться об этих элегантных способах. Вам просто нужно быть профессионалом, чтобы делать вещи, или код уродливый.

Помогите пожалуйста :)

+0

У вас есть начальные и конечные значения, замененные? Ваши данные не выглядят так, как будто они имеют значения, где 'start> = 1780' и' end <= 1720', но, может быть, это данные, которые мы не видим? – ely

+0

Исправлено, спасибо – idoda

ответ

2

Пусть

some_start = 0 
some_end = 1720 

Тогда

x[(x.start >= some_start) & (x.end <= some_end)] 

Обратите внимание, что ваш подход найти индекс, где значение start удовлетворяется, а затем найти индекс, где end Значение удовлетворено имеет некоторые недостатки. Он требует сортировки данных по обоим столбцам и в правильном порядке. Это также означает, что не может быть дубликатов, иначе .index местоположений (мест), где x.start==0 имеет значение True, может не быть единственным скалярным значением.

+0

Спасибо, это на полпути. Единственная проблема с этим решением - это предположение о сортировке столбцов. в моем случае они есть, и это полезно. но что, если данные не были отсортированы? Я хотел бы выбрать строки из местоположения, где определенное условие было удовлетворено до точки, было выполнено другое конкретное условие. Как мне это сделать? а также, как я могу проверить, что я не получил пустой DF? – idoda

+0

Я в замешательстве. Моему решению не нужно сортировать столбцы. Использование 'x [(x.start> = some_start) & (x.end <= some_end)]' будет работать независимо от того, где именно в DataFrame выполняются эти условия, или даже если они встречаются с повторяющимися записями. – ely

+0

Например, предположим, что ваше условие «запуска» происходит в кадре данных * после * вашего состояния «остановки». Как вы можете гарантировать, что этого не происходит? И, если ваши данные * будут отсортированы *, это будет * работать * и предоставить вам требуемый диапазон данных. Поэтому, когда вы можете сделать гарантии относительно упорядочения двух логик, это все равно будет работать. Я предполагаю, что случай, когда он может потерпеть неудачу, состоит в том, что существует несколько отдельных диапазонов строк, которые удовлетворяют критериям старт/стоп, и вам просто нужен первый диапазон. Если это так, вы должны уточнить, повторно задав вопрос. – ely

Смежные вопросы