首页 > 解决方案 > 取没有 NaN 的数据帧的最后 n 行

问题描述

让我们来看看这个数据框:

df = pd.DataFrame(dict(Col1 = [1,2,np.nan,4,5,6], Col2=[4,np.nan,5,np.nan,1,5]))

   Col1  Col2
0   1.0   4.0
1   2.0   NaN
2   NaN   5.0
3   4.0   NaN
4   5.0   1.0
5   6.0   5.0

我想提取没有 NaN 的 df 的最后 n 行。
你能帮我得到这个预期的结果吗?

   Col1  Col2
0     5     1
1     6     5

编辑:假设我不知道最后一个 NaN 在哪里

标签: pythonpandasnumpydataframe

解决方案


使用DataFrame.dropnaDataFrame.tail转换为整数:

N = 2
df1 = df.dropna().tail(N).astype(int)
#alternative
#df1 = df.dropna().iloc[-N:].astype(int)
print (df1)
   Col1  Col2
4     5     1
5     6     5

编辑:对于没有缺失值的最后一组,将错误值与DataFrame.isnaand进行比较DataFrame.any,然后用累积和交换顺序,因此最后一组0在掩码中有值:

m = df.isna().any(axis=1).iloc[::-1].cumsum().eq(0).sort_index()
df1 = df[m].astype(int)
print (df1)
   Col1  Col2
4     5     1
5     6     5

如果没有行匹配,则返回正确的空 DataFrame:

df = pd.DataFrame(dict(Col1 = [1,2,np.nan,4], Col2=[np.nan,np.nan,5,np.nan]))
print (df)
   Col1  Col2
0   1.0   NaN
1   2.0   NaN
2   NaN   5.0
3   4.0   NaN

m = df.isna().any(axis=1).iloc[::-1].cumsum().eq(0).sort_index()
df1 = df[m].astype(int)
print (df1)
Empty DataFrame
Columns: [Col1, Col2]
Index: []

推荐阅读