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

时间:2017-08-27 22:10:22

标签: python pandas sorting dataframe nan

我试图对以下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

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

我现在所做的是:

df.sort_values(by=['age', 'height', 'shoe_size', 'weight'], na_position="first")

4 个答案:

答案 0 :(得分:9)

使用基于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

df.isnull().sum(1)计算NaN s,并根据此排序计数访问行。

@ayhan为上面的解决方案提供了nice little improvement,涉及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            

答案 1 :(得分:2)

这是一个可以做到这一点的单线:

df.assign(Count_NA = lambda x: x.isnull().sum(axis=1)).sort_values('Count_NA', ascending=False).drop('Count_NA', axis=1)
#          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

这可以通过指定一个临时列(“Count_NA”)来计算每一行中的NA,对该列进行排序,然后将其删除,所有这些都在同一个表达式中。

答案 2 :(得分:2)

您可以添加一列空值,按该列排序,然后删除该列。如果您想使用.reset_index(drop=True)重置行数,则取决于您。

df['null_count'] = df.isnull().sum(axis=1)
df.sort_values('null_count', ascending=False).drop('null_count', axis=1)

# returns
         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

答案 3 :(得分:-1)

df.isnull()。sum()。sort_values(ascending = False)