>我有下面的示例数据帧
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 分配给第二行,依此类推。但我实际上不知道该怎么做。
你能帮我吗?
谢谢!
让我们groupby
列Timestamp
Char
和Item
并使用method=first
计算rank
,然后使用sort_values
根据Char
和Item
对数据帧进行排序:
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
Sort
和Transform
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