我试图对以下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")
答案 0 :(得分:9)
使用基于df.sort_values
和loc
的访问权限。
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)