Как выбрать определенные столбцы в Pandas DataFrame, используя несколько логических условий - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь найти очень хороший, исчерпывающий ответ на поставленный выше вопрос.

Давайте возьмем следующий фрейм данных:

df = pd.DataFrame(np.random.randn(4,4), columns=['A', 'B', 'C', 'D'])
df['Category'] = pd.Series(['Cat1', 'Cat2', 'Cat1', 'Cat2'])
df:
            A         B         C         D Category
  0  0.057456  0.462712 -1.245539  0.095947     Cat1
  1  0.741688  0.353600  1.130754 -1.692440     Cat2
  2  0.638623 -0.109566  0.118509 -0.692661     Cat1
  3 -0.905806  0.284818 -0.094696 -1.325617     Cat2

Я понимаю базовую номенклатуру использования df.A или df['A'] для выбора столбца A и df[['A', 'B']] для выбора обоих столбцов A и B.

И если я хочу перейти в логические условия, я могу сделать что-то вроде df[df.A > 0] чтобы вернуть строки, где df.A больше 0. И я могу включить несколько условий, таких как df[(df.A > 0) & (df.Category == 'Cat1')], чтобы включить несколько условий.

Однако я не вижу, как я могу выбрать подмножествостолбцы данных с теми же двумя логическими условиями, которые использовались выше.

Два подхода, которые я испробовал без успеха:

df['B'].where(df.A > 0)

Возвращает все строки в индексе, тогда как я хотел бы только те, которые возвращают True для указанного условия.

Я также безуспешно пытался использовать query, потому что его нельзя использовать в серии.

Итак, df['A'].query(some condition) возвращает сообщение об ошибке.

В идеале решение, которое я ищу, имеет следующие условия:

  1. Может использоваться как на одном столбце, так и на нескольких столбцах.То есть, вы можете выбрать как df['A'], так и df['B'].
  2. При желании можно использовать несколько логических условий, а не только одно.
  3. Возвращает только те строки, которые оцениваются как True для условия, а не для всех строк.
  4. В идеале это синтаксически просто, но если это невозможно, пусть будет так.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Вы правильно выполняете условие df['B'].where(df.A > 0).Тем не менее, просто добавьте еще несколько функций после него, чтобы получить только True результаты.

Пример с множественным (может передавать и одно) условие:

df[['B','C']].where((df.A > 1) & (df.D>0)).dropna().reset_index(drop=True)
0 голосов
/ 02 января 2019

Просто вариант @ ответа ВБ с использованием query:

df.query('A > 0 and B < 0').loc[:, ['B', 'C']]

или

df.query('A > 0 and B < 0')[['B', 'C']]

также напечатает

          B         C
2 -0.109566  0.118509
0 голосов
/ 28 декабря 2018

Я думаю, что вы ищете .loc

df.loc[df.A>0,'B']
0    0.462712
1    0.353600
2   -0.109566
Name: B, dtype: float64
df.loc[(df.A>0)&(df.B<0),['B','C']]
          B         C
2 -0.109566  0.118509
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...