按照分组和时间戳对Pandas DataFrame进行排序。

5

I have the below sample DataFrame

             Timestamp Item Char  Value
4  1/7/2020 1:22:22 AM    B  C.B    3.2
0  1/7/2020 1:23:23 AM    A  C.A    1.0
2  1/7/2020 1:23:23 AM    A  C.B    1.3
1  1/7/2020 1:23:24 AM    A  C.A    2.0
5  1/7/2020 1:23:29 AM    B  C.B    3.0
3  1/7/2020 1:25:23 AM    B  C.B    2.0

我想新增一列,用于指示某个Item在同一Char中的出现顺序,基于Timestamp计算。具体地,我想将最新的值命名为1,次新的值为2,以此类推。
结果应该如下所示:
             Timestamp Item Char  Value   Order
0  1/7/2020 1:23:23 AM    A  C.A    1.0   2
1  1/7/2020 1:23:24 AM    A  C.A    2.0   1
2  1/7/2020 1:23:23 AM    A  C.B    1.3   1 
3  1/7/2020 1:22:22 AM    B  C.B    3.2   3
4  1/7/2020 1:23:29 AM    B  C.B    3.0   2
5  1/7/2020 1:25:23 AM    B  C.B    2.0   1

你可以看到在Char C.B中,B项出现了多次。我想根据时间戳为最近的值分配1。

我的想法是按项目和Char分组DataFrame,然后按时间戳降序排序每个组的行,最后将1分配给第一行,2分配给第二行以此类推。但我不知道具体如何操作。

你能帮我解决这个问题吗?

非常感谢!

2个回答

4

让我们对Timestamp列按照CharItem进行groupby并使用method=first计算rank, 然后使用sort_values根据CharItem排序数据框:

df['Order'] = pd.to_datetime(df['Timestamp'])\
              .groupby([df['Char'], df['Item']])\
              .rank(method='first', ascending=False)

df = df.sort_values(['Char', 'Item'], ignore_index=True)

             Timestamp Item Char  Value  Order
0  1/7/2020 1:23:23 AM    A  C.A    1.0    2.0
1  1/7/2020 1:23:24 AM    A  C.A    2.0    1.0
2  1/7/2020 1:23:23 AM    A  C.B    1.3    1.0
3  1/7/2020 1:22:22 AM    B  C.B    3.2    3.0
4  1/7/2020 1:23:29 AM    B  C.B    3.0    2.0
5  1/7/2020 1:25:23 AM    B  C.B    2.0    1.0

3

排序转换

 df = df.sort_values(['Timestamp'],ascending=False)
 df['Order'] = df.groupby(['Item', 'Char'])['Value'].transform(
     lambda x: np.arange(1, len(x)+1))

样例:

import pandas as pd
from io import StringIO 
data = StringIO("""
,Timestamp,Item,Char,Value
0,1/7/2020 1:22:22 AM,B,C.B,3.2
1,1/7/2020 1:23:23 AM,A,C.A,1.0
2,1/7/2020 1:23:23 AM,A,C.B,1.3
3,1/7/2020 1:23:24 AM,A,C.A,2.0
4,1/7/2020 1:23:29 AM,B,C.B,3.0
5,1/7/2020 1:25:23 AM,B,C.B,2.0
""" )
df = pd.read_csv(data, index_col=0)
df['Timestamp'] = pd.to_datetime(df['Timestamp'])


df = df.sort_values(['Timestamp'],ascending=False)
df['Order'] = df.groupby(['Item', 'Char'])['Value'].transform(
     lambda x: np.arange(1, len(x)+1))
 
print (df.sort_values(['Item', 'Timestamp']))

输出:

            Timestamp Item Char  Value  Order
1 2020-01-07 01:23:23    A  C.A    1.0    2.0
2 2020-01-07 01:23:23    A  C.B    1.3    1.0
3 2020-01-07 01:23:24    A  C.A    2.0    1.0
0 2020-01-07 01:22:22    B  C.B    3.2    3.0
4 2020-01-07 01:23:29    B  C.B    3.0    2.0
5 2020-01-07 01:25:23    B  C.B    2.0    1.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接