Фильтровать сгруппированные строки на основе нескольких условий в Pandas - PullRequest
1 голос
/ 23 апреля 2020

Учитывая данные кадра следующим образом:

  city district        date  price
0   bj       cy  2019-03-01    NaN
1   bj       cy  2019-04-01    6.0
2   sh       hp  2019-03-01    4.0
3   sh       hp  2019-04-01    3.0
4   bj       hd  2019-03-01    7.0
5   bj       hd  2019-04-01    NaN

Мне нужно отфильтровать сгруппированные строки city и district, когда были выполнены оба следующих условия: date равно 2019-04-01 и price - это NaN.

Я проверил следующий код:

df['date'] = pd.to_datetime(df['date']).dt.date.astype(str)
df.groupby(['city','district']).filter(lambda x: (x['price'].isnull() & x['date'].isin(['2019-04-01'])).any())

Out:

  city district        date  price
4   bj       hd  2019-03-01    7.0
5   bj       hd  2019-04-01    NaN

Еще один тест:

df.groupby(['city','district']).filter(lambda x: (x['price'].isnull() & x['date']).any())

Out:

  city district        date  price
0   bj       cy  2019-03-01    NaN
1   bj       cy  2019-04-01    6.0
4   bj       hd  2019-03-01    7.0
5   bj       hd  2019-04-01    NaN

Но мне нужно, как показано ниже. Как я могу изменить код выше? Большое спасибо.

  city district      date  price
0   bj       cy  2019/3/1    NaN
1   bj       cy  2019/4/1    6.0
2   sh       hp  2019/3/1    4.0
3   sh       hp  2019/4/1    3.0

1 Ответ

1 голос
/ 23 апреля 2020

Я думаю, вам нужна инвертирующая маска - здесь & до |, isnull до notna, eq до ne и any до all:

df['date'] = pd.to_datetime(df['date'])

f = lambda x: (x['price'].notna() | x['date'].ne('2019-04-01')).all()
df = df.groupby(['city','district']).filter(f)
print (df)
  city district       date  price
0   bj       cy 2019-03-01    NaN
1   bj       cy 2019-04-01    6.0
2   sh       hp 2019-03-01    4.0
3   sh       hp 2019-04-01    3.0

Или возможно использовать not для инвертирования логического значения True до False и False до True:

f = lambda x: not (x['price'].isnull() & x['date'].eq('2019-04-01')).any()
df = df.groupby(['city','district']).filter(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...