Python 在多行上删除给定条件的索引
我试图在满足特定条件时删除属于给定索引的行。在本例中,我希望在属于该索引的所有值都是NaT时删除该索引 我尝试过使用以下代码,但dropna方法无法解决问题Python 在多行上删除给定条件的索引,python,pandas,filter,Python,Pandas,Filter,我试图在满足特定条件时删除属于给定索引的行。在本例中,我希望在属于该索引的所有值都是NaT时删除该索引 我尝试过使用以下代码,但dropna方法无法解决问题 import pandas as pd df_dict = {'id':['001','002','002','003','003'],'req_dat':['2018-11-20','2018-12-13','2018-12-23','2018-12-27','2018-12-30'],'app_date':['2018-1
import pandas as pd
df_dict = {'id':['001','002','002','003','003'],'req_dat':['2018-11-20','2018-12-13','2018-12-23','2018-12-27','2018-12-30'],'app_date':['2018-11-21','NaT','2018-12-24','NaT','NaT'],'can_date':['2019-02-21','NaT','2019-01-25','NaT','NaT']}
df = pd.DataFrame.from_dict(df_dict)
df1 = df.set_index(['id','req_dat'])
df2 = df1.dropna(how='all')
这是原始数据帧:
app_date can_date
id req_dat
001 2018-11-20 2018-11-21 2019-02-21
002 2018-12-13 NaT NaT
2018-12-23 2018-12-24 2019-01-25
003 2018-12-27 NaT NaT
2018-12-30 NaT NaT
我得到了这个结果:
app_date can_date
id req_dat
001 2018-11-20 2018-11-21 2019-02-21
002 2018-12-23 2018-12-24 2019-01-25
我希望这样,req_dat=2018-12-13的行不会被删除,因为它属于id=002而不是所有属于id=002的行都是NaT,因此不应该删除任何行:
app_date can_date
id req_dat
001 2018-11-20 2018-11-21 2019-02-21
002 2018-12-13 NaT NaT
2018-12-23 2018-12-24 2019-01-25
提前感谢。您应该在
id
上分组,在这种情况下级别0
,然后检查该组的所有行是否都是NaT
。然后使用布尔索引来保留并非全部NaT
的行:
m = df.set_index(['id', 'req_dat']).groupby(level=0).transform(lambda x: x.isna().all()).all(axis=1)
df[~m.values]
输出
id req_dat app_date can_date
0 001 2018-11-20 2018-11-21 2019-02-21
1 002 2018-12-13 NaT NaT
2 002 2018-12-23 2018-12-24 2019-01-25
您可以执行变换
和最大值
:
df1[df1.groupby(level=0).transform('max').notna().all(1)]
拥有NaT
行意味着什么?所有列都是NaT
的行,或者任何列都是NaT
?请举一个例子,其中一些行被删除,而属于索引003的行被删除,我可以在应用dropna方法之前添加原始数据帧。我的意思是所有的Colmun都是NaT,我也会编辑它。谢谢你的回复。
app_date can_date
id req_dat
1 2018-11-20 2018-11-21 2019-02-21
2 2018-12-13 NaT NaT
2018-12-23 2018-12-24 2019-01-25