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

问题描述 投票:2回答:4

我正在尝试对以下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")
python pandas sorting dataframe nan
4个回答
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

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


@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            

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
投票

您可以添加一列空值,按该列排序,然后删除该列。如果你想使用.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

-1
投票

df.isnull()。总和()。sort_values(升序=假)

© www.soinside.com 2019 - 2024. All rights reserved.