python - 在 Pandas 的列中删除具有空值的索引
问题描述
尝试删除与多级索引中的索引有关的空值
我正在尝试删除“数据”列中包含任何空值的所有 ID(索引级别 1)。
例如,我在下面创建了一个示例数据框:
import pandas as pd
import numpy as np
ids = ['0', '0', '0', '0', '0', '1','1','1','1','1','2','2','2','2','2','3','3','3','3','3']
dates = ['1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21','1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21','1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21','1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21']
data = [np.nan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, np.nan, 16, 17, 18, 19]
df = pd.DataFrame(data=data, index=[ids,dates], columns=['Data'])
我希望清理数据框以有效地仅返回与 ID 为 1 或 2 相关的行,因为这些是索引第二级中任何日期的唯一没有空值的 ID。
我试过df.dropna(subset=['Data'], inplace=True)
了,但这只会删除具有空值的行,而不是整个索引。
如果 Pandas Dataframe 中的任何行具有空值,那么删除与索引有关的所有行的最佳方法是什么?
解决方案
识别具有任何 NaN 的 andex 并过滤掉相反的内容
df.groupby(level=0).filter(lambda x:~(x.isna().any()))
正如@sammywemmy 所建议的那样,还可以过滤没有NaNs
using的组x.notna().all()
。代码如下;
df.groupby(level=0).filter(lambda x: (x.notna().all()))
Data
1 1/1/21 5.0
1/2/21 6.0
1/3/21 7.0
1/4/21 8.0
1/5/21 9.0
2 1/1/21 10.0
1/2/21 11.0
1/3/21 12.0
1/4/21 13.0
1/5/21 14.0