Поддерживает ли фильтрация pandas псевдонимы?

#python #pandas

#python #pandas

Вопрос:

Рассмотрим операцию фильтрации в pandas :

    first_replies_wo_comments = pandas.read_csv(path)

   recent = first_replies_wo_comments[
    (first_replies_wo_comments.POST_CREATED_AT > '2018-02-01') amp; 
    (first_replies_wo_comments.POST_CREATED_AT < '2018-03-13')
   ]
  

Обратите внимание, что имя first_replies_wo_comments фрейма данных указывается три раза. Если бы были дополнительные условия фильтрации, их было бы еще больше. Есть ли какой-либо способ псевдонимировать df — способом, аналогичным псевдонимам в SQL ?

Обновление, о котором я знал / знаю dataframe.query() . Мне интересно, какие варианты существуют при использовании подхода, заключенного в скобки (внутри [] ). Спасибо!

Комментарии:

1. x = first_replies_wo_comments тогда просто x.POST_CREATED_AT ...

2. Почему бы не создать переменную date_field = first_replies_wo_comments.POST_CREATED_AT ? Еще лучше использовать pd.Series.between , т. е. date_field.between(x, y, inclusive=False) .

3. Вы также можете использовать df.query() which принимает строку запроса, которая позволяет вам получать доступ к столбцам без имени фрейма данных. Однако это может иметь (хорошие или плохие) последствия для производительности. Но опять же, в общем, вы могли бы просто назначить другое, более короткое имя.

Ответ №1:

Вы можете использовать DataFrame.query для этого, и вы можете связать каждое новое условие:

 df = pd.DataFrame({'POST_CREATED_AT': pd.date_range('20180128', periods=7)})
print(df)

  POST_CREATED_AT
0      2018-01-28
1      2018-01-29
2      2018-01-30
3      2018-01-31
4      2018-02-01
5      2018-02-02
6      2018-02-03
  

 df_filter = df.query('POST_CREATED_AT > 20180201').query('POST_CREATED_AT < 20180313')
print(df_filter)

  POST_CREATED_AT
5      2018-02-02
6      2018-02-03
  

Другой метод mask это ваши условия, которые более близки к псевдонимам SQL:

 df = pd.DataFrame({'POST_CREATED_AT': pd.date_range('20180128', periods=7),
                   'ID':['A', 'B', 'C', 'D', 'E', 'F', 'G']})
print(df)
  POST_CREATED_AT ID
0      2018-01-28  A
1      2018-01-29  B
2      2018-01-30  C
3      2018-01-31  D
4      2018-02-01  E
5      2018-02-02  F
6      2018-02-03  G
  

 m1 = df['POST_CREATED_AT'].between('20180201', '20180313', inclusive=False)
m2 = df['ID'] == 'G'

print(df[m1 amp; m2])

  POST_CREATED_AT ID
6      2018-02-03  G
  

Комментарии:

1. Спасибо — возможно, мне следовало указать, не прибегая к df.query на основе строк (я знаю об этом подходе). Ваш ответ в любом случае будет полезен другим.

2. Понятно. Уже добавлял другой метод к моему ответу @javadba

3. Я действительно ищу что-то вроде псевдонимов (а не дополнительных методов), но в любом случае поддержу ваш ответ как «вероятно, полезный для читателей»

4. @Efran К вашему сведению, вы можете комбинировать строки следующим query образом: df.query('20180201 < POST_CREATED_AT < 20180313')