Отфильтровать группы по значению NaN для одного столбца в Pandas - PullRequest
1 голос
/ 23 апреля 2020

С учетом следующего кадра данных:

  city district  year  price
0   bj       cy  2018    NaN
1   bj       cy  2019    6.0
2   sh       hp  2018    4.0
3   sh       hp  2019    3.0
4   bj       hd  2018    7.0
5   bj       hd  2019    NaN

Как можно сгруппировать city и district и отфильтровать строки, если price равно NaN? Спасибо.

Мне нужен был следующий вывод:

  city district  year  price
0   bj       cy  2018    NaN
1   bj       cy  2019    6.0
2   bj       hd  2018    7.0
3   bj       hd  2019    NaN

Я пробовал с df.groupby(['city', 'district']).filter(lambda df: df[df['price'].isnull()]), но он не работает.

1 Ответ

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

Используйте GroupBy.transform с тестом, если хотя бы один NaN, это означает один True на группу:

mask = (df.assign(test = df['price'].isnull())
          .groupby(['city', 'district'])['test']
          .transform('any'))
df = df[mask]

print (df)
  city district  year  price
0   bj       cy  2018    NaN
1   bj       cy  2019    6.0
4   bj       hd  2018    7.0
5   bj       hd  2019    NaN

Если производительность не важна или мала DataFrame возможное использование DataFrameGroupBy.filter:

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