gpt4 book ai didi

python - 沿 axis=1 对值进行排序,NaN 位于行开头

转载 作者:行者123 更新时间:2023-12-01 01:20:56 24 4
gpt4 key购买 nike

如何对 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

输出应该在

1002_NUc_Marathalli_7 NaN 0.481 0.550 0.734

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

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

但是这里的 nan 值出现在行的末尾。我想要第一个的 nan

最佳答案

您可以使用 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 在这种情况下的工作方式,我们举个例子:

l = [0.734, 0.481, np.nan, 0.550]

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 所做的是使用每个元组中的两个项目进行排序,因此优先考虑第一个元素(因此元组以 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)]

请注意,这些 bool 值就足够了,因为它们被解释为 True==1False==0,在这种情况下将给出所需的顺序。如果我们这样做:

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]

关于python - 沿 axis=1 对值进行排序,NaN 位于行开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com