按组和时间戳对熊猫数据帧进行排序



>我有下面的示例数据帧

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

我想添加一个新列,该列根据时间戳告诉项目在同一字符中出现的顺序。特别是,我想将 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

如您所见,B 项在 Char C.B 中多次出现。我会根据时间戳将 1 分配给最新值。

我的想法是按项目和字符对数据帧进行分组,然后按时间戳降序对每个组的行进行排序,最后将 1 分配给第一行,将 2 分配给第二行,依此类推。但我实际上不知道该怎么做。

你能帮我吗?

谢谢!

让我们groupbyTimestampCharItem并使用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

SortTransform

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

最新更新