Как создать индекс истинности для всех в фрейме данных pandas?

#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-строки или другой язык шаблонов для передачи переменных в свой список условий.