#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')