python - 有没有办法在熊猫的多列中过滤后获取原始行的索引?
问题描述
列:id, message, date, time
有多行相同的 id 和相同的消息,但日期和时间不同。我试过了
df.groupby('id')[['date', 'time']].max()
但这会给我最新日期和时间的 ID。但我需要整个专栏。有没有办法在使用groupby
或其他方式过滤后保留原始索引?
我的数据是什么样的:
ID | 信息 | 日期 | 时间 |
---|---|---|---|
1 | 你好 | 2021-01-02 | 01:34:23 |
1 | 你好 | 2021-01-01 | 12:01:11 |
2 | 你好 | 2021-03-02 | 11:11:12 |
2 | 你好 | 2021-02-11 | 05:10:12 |
输出应该是
ID | 信息 | 日期 | 时间 |
---|---|---|---|
1 | 你好 | 2021-01-02 | 01:34:23 |
2 | 你好 | 2021-03-02 | 11:11:12 |
解决方案
通过DataFrameGroupBy.idxmax
将两列加入每个组的最大值并通过以下方式选择行,用于日期时间的索引DataFrame.loc
:
s = pd.to_datetime(df['date'] + ' ' + df['time'])
df1 = df.loc[s.groupby(df['id']).idxmax()]
print (df1)
id message date time
0 1 hi 2021-01-02 01:34:23
2 2 hello 2021-03-02 11:11:12
详情:
print (s.groupby(df['id']).idxmax())
id
1 0
2 2
dtype: int64
编辑:
如果 date 列没有字符串但date
s 有错误:
s = pd.to_datetime(df['date'] + ' ' + df['time'])
类型错误:+ 不支持的操作数类型:“datetime.date”和“str”
可能的解决方案:
s = pd.to_datetime(df['date'].astype(str) + ' ' + df['time'].astype(str))
编辑:
如果需要按两列排序,然后删除重复项:
df = df.sort_values(['date','time']).drop_duplicates('id', keep='last')
print (df)
id message date time
0 1 hi 2021-01-02 01:34:23
2 2 hello 2021-03-02 11:11:12
推荐阅读
- python - PyQt5:寻找在应用程序中嵌入外部应用程序窗口的示例
- python - 使用 Heroku 设置 S3 和使用图像设置 Django
- java - 如何向连接到 Undertow websocket 服务器的所有客户端广播消息?
- jade-platform - JSON反序列化对象处理
- visual-studio - Visual Studio 2017 登录情况
- c++ - 是否可以将未知类型的变量声明为类成员变量?
- c# - 如何在变量声明 (CS0270) 中强制执行数组的长度?
- java - 在 Android Studio 中使用 Java 添加自定义货币
- python - 如何使用多层感知器并在给定倾斜分布特征的情况下进行预测
- atom-editor - 我总是以 Atom 中的混合行尾结尾