Например, у меня есть простой DF:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Могу ли я выбрать значения из «A», для которых соответствующие значения для «B» будут больше 50, а для «C» - не равны 900, используя методы и идиомы Панд?
df.query
и,pd.eval
кажется, хорошо подходит для этого варианта использования. Для получения информации оpd.eval()
семействе функций, их функциях и сценариях использования, пожалуйста, посетите Dynamic Expression Evaluation в pandas, используя pd.eval () .Ответы:
Конечно! Настроить:
Мы можем применять операции со столбцами и получать объекты логической серии:
[Обновить, чтобы перейти на новый стиль
.loc
]:И затем мы можем использовать их для индексации объекта. Для доступа на чтение вы можете связать индексы:
но вы можете столкнуться с проблемами из-за разницы между видом и копией, делающими это для доступа на запись. Вы можете использовать
.loc
вместо:Обратите внимание, что я случайно набрал
== 900
и нет!= 900
, или~(df["C"] == 900)
, но мне лень это исправить. Упражнение для читателя. : ^)источник
.loc
обновлении - было бы хорошо, если бы вы уточнили, где мы получаем копию, а где просмотр.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Другое решение заключается в использовании метода запроса :
Теперь, если вы хотите изменить возвращенные значения в столбце A, вы можете сохранить их индекс:
.... и используйте,
.iloc
чтобы изменить их, т.е.источник
И не забудьте использовать скобки!
Имейте в виду, что
&
оператор имеет приоритет над такими операторами, как>
и<
т. Д. Вот почемуоценивает до
False
. Поэтому, если вы используетеpd.loc
, вам нужно заключить в скобки логические утверждения, в противном случае вы получите ошибку. Вот почемувместо того
что приведет к
источник
Вы можете использовать панд, у него есть некоторые встроенные функции для сравнения. Поэтому, если вы хотите выбрать значения «A», которые удовлетворяют условиям «B» и «C» (при условии, что вы хотите вернуть объект DataFrame pandas)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
вернет вам столбец A в формате DataFrame.Функция pandas 'gt' возвращает позиции столбца B, которые больше 50, а 'ne' возвращает позиции, не равные 900.
источник