我有以下 Dataframe :
df1 = pd.DataFrame(data={'val1': [1, np.NaN, 2, 3],
'val2': [np.NaN, 1, np.NaN, np.NaN],
'val3': [3, np.NaN, 1, 1]},
index=pd.Series([1, 2, 3, 4], name='index'))
>>> df1
val1 val2 val3
index
1 1.0 NaN 3.0
2 NaN 1.0 NaN
3 2.0 NaN 1.0
4 3.0 NaN 1.0
引用this answer,我创建了一个以列名作为值的数据框:
i = np.argsort(df1.to_numpy(), axis=1)
r = pd.DataFrame(df1.columns.to_numpy()[i],
index=df1.index,
columns=range(1, i.shape[1] + 1)).add_prefix('Rank')
>>> r
Rank1 Rank2 Rank3
index
1 val1 val3 val2
2 val2 val1 val3
3 val3 val1 val2
4 val3 val1 val2
然而,我试图从排名中删除NA
值,如下所示:
>>> r
Rank1 Rank2 Rank3
index
1 val1 val3 NaN
2 val2 NaN NaN
3 val3 val1 NaN
4 val3 val1 NaN
我相信argsort
方法没有任何参数来跳过Null值。我已经尝试将缺失的值转换为(-1),如下所示,但我只能对一个序列而不是一个 Dataframe 这样做:
>>> series = df1.iloc[0]
>>> series.argsort()
val1 0
val2 -1
val3 1
Name: 1, dtype: int64
1条答案
按热度按时间px9o7tmv1#
在这里,我做了一个函数,允许你创建正确处理null情况的排名: