沿轴排序值=1,在s处有NaNs

2024-09-28 03:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

如何对pandas数据帧进行排序按升序对一行中的所有列值进行排序,并首先保留NaN值

示例数据帧是

                       2018-07-01  2018-07-02  2018-07-03  2018-07-04  
cell_name                                                                                                                                            
1002_NUc_Marathalli_7        0.734       0.550       NaN         0.481             
1002_NUc_Marathalli_8        1.338       1.220       0.911       0.601       
1002_NUc_Marathalli_9        0.330       1.180       0.754       0.631       
1003_IU2_Munnekolalu_7       0.628       0.479       0.988       0.694       
1003_IU2_Munnekolalu_8       5.327       6.831       8.387       9.428       

输出应该在

^{pr2}$

我可以使用以下方法创建另一个数据帧:

df1 = pd.DataFrame(np.sort(df.values,axis=1), index=df.index, columns=df.columns)

但是这里的nan值在行的末尾。我希望在第一个值中使用nan


Tags: columns数据示例pandasdfindex排序nan
2条回答

您可以使用key参数对数据帧行进行排序,以首先保留NaNs

l = df.apply(sorted, key = lambda s: (~np.isnan(s), s), axis = 1)
pd.DataFrame(l.values.tolist(), columns=df.columns)

      2018-07-01  2018-07-02  2018-07-03  2018-07-04
0         NaN       0.481       0.550       0.734
1       0.601       0.911       1.220       1.338
2       0.330       0.631       0.754       1.180
3       0.479       0.628       0.694       0.988
4       5.327       6.831       8.387       9.428

说明

为了了解sorted在这种情况下的工作方式,让我们举个例子:

^{pr2}$

Sorted接受一个key参数,该参数可用于定义一个函数,在实际排序发生之前,使用该函数可以转换数据收集。在

那么在这种情况下有什么意义呢?理想的情况是有一些标准,根据这些标准我们可以确定序列中是否存在np.nan,并使这些情况排在第一位。如何转换数据以便以后sorted可以实现这一点?在

可以做的是为列表中的每一项添加一个额外的字段,该字段也将被用于对列表进行排序。假设我们有:

lt = [(1, 0.734), (1, 0.481), (0, np.nan), (1, 0.550)]

所以本质上是一个标识符,用于判断是否每个元素上都是NaN。现在我们要做的是:

sorted(lt)
[(0, nan), (1, 0.481), (1, 0.55), (1, 0.734)]

sorted所做的是使用每个tuple中的两个项目进行排序,因此优先排序第一个元素(因此以0开头的元组排在第一个元素之前),其余的元素按第二个项排序,因为第一个元素是1。那么,有什么办法可以达到这个目的呢?在

如果将上面的lambda表达式重写为列表理解,它将等效于:

sl = [(~np.isnan(s), s) for s in l]
print(sl)
[(True, 0.734), (True, 0.481), (False, nan), (True, 0.55)]

注意,tese布尔值已经足够了,因为它们被解释为True==1和{},这将在本例中给出所需的顺序。如果我们这样做:

sorted(sl)
[(False, nan), (True, 0.481), (True, 0.55), (True, 0.734)].

这可以在key参数中实现为lambda或匿名函数,如下所示:

sorted(l, key = lambda s: (~np.isnan(s), s))

在上面的例子中,会给出:

[nan, 0.481, 0.55, 0.734]

您可以使用fillna(float('-inf'))replace

pd.DataFrame(
    np.sort(df.fillna(float('-inf')).values, axis=1), 
    index=df.index, 
    columns=df.columns
).replace(float('-inf'), np.nan)

相关问题 更多 >

    热门问题