首页 > 解决方案 > 有没有办法在熊猫的多列中过滤后获取原始行的索引?

问题描述

列: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

标签: pythonpandasdataframe

解决方案


通过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 列没有字符串但dates 有错误:

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

推荐阅读