在pandas中返回跳过nan值的排序索引?

3 投票
1 回答
1179 浏览
提问于 2025-04-17 17:53

我有以下的数据集:

PID,RUN_START_DATE,PUSHUP_START_DATE,SITUP_START_DATE,PULLUP_START_DATE
1,2013-01-24,2013-01-02,,2013-02-03
2,2013-01-30,2013-01-21,2013-01-13,2013-01-06
3,2013-01-29,2013-01-28,2013-01-01,2013-01-29
4,2013-02-16,2013-02-12,2013-01-04,2013-02-11
5,2013-01-06,2013-02-07,2013-02-25,2013-02-12
6,2013-01-26,2013-01-28,2013-02-12,2013-01-10
7,2013-01-26,,2013-01-12,2013-01-30
8,2013-01-03,2013-01-24,2013-01-19,2013-01-02
9,2013-01-22,2013-01-13,2013-02-03,
10,2013-02-06,2013-01-16,2013-02-07,2013-01-11

我知道可以用 numpy.argsort 来返回值的排序索引:

SQ_AL_INDX = numpy.argsort(df_sequence[['RUN_START_DATE', 'PUSHUP_START_DATE', 'SITUP_START_DATE', 'PULLUP_START_DATE']], axis=1)

...返回...

   RUN_START_DATE  PUSHUP_START_DATE  SITUP_START_DATE  PULLUP_START_DATE
0               2                  1                 0                  3
1               3                  2                 1                  0
2               2                  1                 0                  3
3               2                  3                 1                  0
4               0                  1                 3                  2
5               3                  0                 1                  2
6               1                  2                 0                  3
7               3                  0                 2                  1
8               3                  1                 0                  2
9               3                  1                 0                  2

但是,它似乎把 pandas.NaT 的值放在了第一位。所以在这个例子中,当 PID == 1 时,排序的顺序返回的是 2 1 0 3。不过,第二个索引位置是一个 pandas.NaT 的值。

我该如何在获取排序索引的同时跳过 pandas.NaT 的值呢?比如,返回的索引值可以是 2 1 np.NaN 3 或者 2 1 pandas.NaT 3,更好的是对于 PID 1 返回 1 0 2 而不是 2 1 0 3

1 个回答

2

numpy.argsort 传给 apply 方法,而不是直接使用它。这样,NaN(缺失值)和 NaT(缺失的时间值)就能保留下来。对于你的例子:

In [2]: df_sequence[['RUN_START_DATE', 'PUSHUP_START_DATE', 'SITUP_START_DATE', 'PULLUP_START_DATE']].apply(numpy.argsort, axis=1)
Out[2]: 
                RUN_START_DATE  PUSHUP_START_DATE  SITUP_START_DATE  PULLUP_START_DATE
0               1                  0               NaN               2
(etc.)

撰写回答