给出如下数据框:
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()])
,但是它不起作用。
答案 0 :(得分:2)
将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())