如何在 Data Frame 中创建新列以根据 Python Pandas 中的日期列对每个 id 的值进行排序?[复制]

How to create new column in Data Frame to sort values for each id based on date column in Python Pandas? [duplicate]

提问人:dingaro 提问时间:11/14/2023 更新时间:11/14/2023 访问量:30

问:

我在 Python Pandas 中有 Data Frame,如下所示:

  • 列 my_date 采用日期时间格式。

  • 在我的实际 DataFrame 中,我有更多的列。

    编号 my_date col1
    111 2023-05-15 1
    111 2023-05-14 11
    111 2023-05-13 2
    222 2023-10-11 3
    222 2023-10-12 55

我需要创建新的列col_x其中每个 id 的值为 1、2、3 等,具体取决于第 my_date 列中的日期。因此,对于列中的每个 id,col_x 必须在 my_date 的早期日期为 1,依此类推。

因此,因此我需要如下所示的东西:

编号 my_date col1 col_x
111 2023-05-15 1 3
111 2023-05-14 11 2
111 2023-05-13 2 1
222 2023-10-11 3 1
222 2023-12-12 55 2

如何在Python Pandas中做到这一点?

Python Pandas 数据帧 日期 日期时间

评论


答:

0赞 mozway 11/14/2023 #1

看起来您可以使用 groupby.rank

df['col_x'] = df.groupby('id')['my_date'].rank('dense').astype(int)

这或多或少等同于查找排序顺序(例如使用 numpy.argsort 或 ),只是它会对重复值进行平均排名:rank('first')

df['col_x'] = df.groupby('id')['my_date'].transform(np.argsort).add(1)

输出:

    id    my_date  col1  col_x
0  111 2023-05-15     1      3
1  111 2023-05-14    11      2
2  111 2023-05-13     2      1
3  222 2023-10-11     3      1
4  222 2023-10-12    55      2

具有重复值的示例:

    id    my_date  col1  rank('dense')  argsort+1  rank('first')
0  111 2023-05-15     1              3          4              4
1  111 2023-05-14    11              2          2              2
2  111 2023-05-14     9              2          3              3
3  111 2023-05-13     2              1          1              1
4  222 2023-10-11     3              1          1              1
5  222 2023-10-12    55              2          2              2