#pandas #filter
#панды #Фильтр
Вопрос:
Я использую панд и сталкивался с несколькими случаями, когда у меня был программно сгенерированный список условных обозначений, например
conditionals = [ df['someColumn'] == 'someValue', df['someOtherCol'] == 'someOtherValue', df['someThirdCol'].isin(['foo','bar','baz']), ]
и я хочу выбрать строки, в которых ВСЕ эти условия верны. Я думаю, что сделал бы что-то подобное.
bigConditional = IHaveNoIdeaOfWhatToPutHere for conditional in conditionals: bigConditional = bigConditional amp;amp; conditional filteredDf = df[bigConditional]
Я знаю, что ХОЧУ использовать свойство identity, в котором bigConditional инициализируется рядом значений true для каждого индекса в моем фрейме данных, так что, если какое-либо условие в моем списке условных обозначений будет равно false, эта строка не будет в отфильтрованном фрейме данных, но изначально рассматривается каждая строка.
Я не знаю, как это сделать, или, по крайней мере, не самый лучший и лаконичный способ, который показывает, что это намеренно
Кроме того, я сталкивался с обратными сценариями, когда мне нужно только одно из условий, чтобы соответствовать, чтобы включить строку в новый фрейм данных, поэтому мне нужно, чтобы bigConditional было установлено значение false для каждого индекса в фрейме данных.
Ответ №1:
как насчет суммирования условий и проверки, равно ли оно количеству условий
filteredDf = df.loc[sum(conditionals)==len(conditionals)]
или еще проще, с np.all
filteredDf = df.loc[np.all(conditionals, axis=0)]
в противном случае для вашего исходного вопроса вы можете создать серию истинных индексированных, таких как df, и ваш for
цикл должен работать.
bigConditional = pd.Series(True, index=df.index)
Ответ №2:
Может быть, вы можете использовать query
и генерировать свои условия следующим образом:
conditionals = [ "someColumn == 'someValue'", "someOtherCol == 'someOtherValue'", "someThirdCol.isin(['foo', 'bar', 'baz'])", ] qs = ' amp; '.join(conditionals) out = df.query(qs)
Или используйте eval
для создания логических значений вместо фильтрации фрейма данных:
mask = df.eval(qs)
ДЕМОНСТРАЦИЯ
Предположим, что этот фрейм данных:
gt;gt;gt; df someColumn someOtherCol someThirdCol 0 someValue someOtherValue foo 1 someValue someOtherValue baz 2 someValue anotherValue anotherValue 3 anotherValue anotherValue anotherValue gt;gt;gt; df.query(qs) someColumn someOtherCol someThirdCol 0 someValue someOtherValue foo 1 someValue someOtherValue baz gt;gt;gt; df.eval(qs) 0 True 1 True 2 False 3 False dtype: bool
Вы даже можете использовать f-строки или другой язык шаблонов для передачи переменных в свой список условий.