我试图对下面的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")
发布于 2017-08-27 14:21:03
使用基于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
进行计数,并根据这个排序计数访问行。
@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
发布于 2019-03-29 01:47:08
df.isnull().sum().sort_values(ascending=False)
发布于 2017-08-27 14:18:22
下面是一条能做到这一点的单线线:
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")来计算每行中的NAs,对该列进行排序,然后删除它,所有这些都在同一个表达式中完成。
https://stackoverflow.com/questions/45909776
复制相似问题