首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组和时间戳对Pandas DataFrame排序

按组和时间戳对Pandas DataFrame排序
EN

Stack Overflow用户
提问于 2020-10-04 21:19:47
回答 2查看 48关注 0票数 5

我有下面的示例DataFrame

代码语言:javascript
复制
             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赋给倒数第二个值,依此类推。

结果应该如下所示

代码语言:javascript
复制
             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分配给第二行,依此类推。但我真的不知道怎么做。

你能帮帮我吗?

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2020-10-04 21:45:37

让我们在CharItem上对列Timestamp执行groupby操作,并使用method=first计算rank,然后使用sort_values根据CharItem对数据帧进行排序

代码语言:javascript
复制
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)

代码语言:javascript
复制
             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
票数 4
EN

Stack Overflow用户

发布于 2020-10-04 21:39:09

SortTransform

代码语言:javascript
复制
 df = df.sort_values(['Timestamp'],ascending=False)
 df['Order'] = df.groupby(['Item', 'Char'])['Value'].transform(
     lambda x: np.arange(1, len(x)+1))

示例:

代码语言:javascript
复制
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']))

输出:

代码语言:javascript
复制
            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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64195126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档