按NaN计数的降序对数据帧的行进行排序

Jua*_*los 2 python sorting nan dataframe pandas

我正在尝试对以下Pandas DataFrame进行排序:

         RHS  age  height  shoe_size  weight
0     weight  NaN     0.0        0.0     1.0
1  shoe_size  NaN     0.0        1.0     NaN
2  shoe_size  3.0     0.0        0.0     NaN
3     weight  3.0     0.0        0.0     1.0
4        age  3.0     0.0        0.0     1.0
Run Code Online (Sandbox Code Playgroud)

以这种方式,首先定位具有更多NaNs列数的行.更确切地说,在上面的df中,索引为1(2 Nans)的行应该在索引为0(1 NaN)的行之前.

我现在做的是:

df.sort_values(by=['age', 'height', 'shoe_size', 'weight'], na_position="first")
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 10

使用df.sort_valuesloc基于访问.

df = df.iloc[df.isnull().sum(1).sort_values(ascending=0).index]
print(df)

         RHS  age  height  shoe_size  weight
1  shoe_size  NaN     0.0        1.0     NaN
2  shoe_size  3.0     0.0        0.0     NaN
0     weight  NaN     0.0        0.0     1.0
4        age  3.0     0.0        0.0     1.0
3     weight  3.0     0.0        0.0     1.0
Run Code Online (Sandbox Code Playgroud)

df.isnull().sum(1)计算NaNs并根据此排序计数访问行.


@ayhan 对上述解决方案提供了一个很好的改进,包括pd.Series.argsort:

df = df.iloc[df.isnull().sum(axis=1).mul(-1).argsort()]
print(df)

         RHS  age  height  shoe_size  weight 
1  shoe_size  NaN     0.0        1.0     NaN           
0     weight  NaN     0.0        0.0     1.0           
2  shoe_size  3.0     0.0        0.0     NaN           
3     weight  3.0     0.0        0.0     1.0           
4        age  3.0     0.0        0.0     1.0            
Run Code Online (Sandbox Code Playgroud)

  • 使用 argsort 可以在一次操作中完成排序和获取索引。`df.iloc[np.argsort(-df.isnull().sum(axis=1))]` 它也在 pd.Series 上定义为一种方法。`df.iloc[df.isnull().sum(axis=1).mul(-1).argsort()]` 它非常相似,所以我想我会把它留在这里而不是发布答案。 (2认同)

小智 6

df.isnull().sum().sort_values(ascending=False)
Run Code Online (Sandbox Code Playgroud)