我有下面的示例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我想添加一个新的列,它根据时间戳告诉一个项目在同一个Char中出现的顺序。特别是,我想将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赋给最近的值。
我的想法是按照Item和Char对DataFrame进行分组,然后按时间戳按降序对每组中的行进行排序,最后将1分配给第一行,将2分配给第二行,依此类推。但我真的不知道怎么做。
你能帮帮我吗?
非常感谢!
发布于 2020-10-04 21:45:37
让我们在Char和Item上对列Timestamp执行groupby操作,并使用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发布于 2020-10-04 21:39:09
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.0https://stackoverflow.com/questions/64195126
复制相似问题