如何保留DataFrame中B列每组对应A列最新日期的行?
按分组保留DataFrame中最新日期的行
核心步骤说明
首先要把日期列(A列)转换成日期类型,否则字符串格式的日期直接比较大小会出错。之后通过分组筛选出每个类别(B列)对应的最新日期行。
完整代码实现
1. 构造示例数据并转换日期格式
import pandas as pd # 构造你提供的示例数据 data = { 'A': ['26/12/2023', '26/12/2022', '26/12/2023', '26/12/2022', '26/12/2023', '26/12/2022', '26/12/2023'], 'B': ['apple', 'apple', 'pear', 'orange', 'wildberry', 'wildberry', 'grapes'], 'E': ['7,9', '8,3', '28,6', '33,3', '24,7', '29,1', '17,1'] } df = pd.DataFrame(data) # 把A列从字符串转成日期格式(dayfirst=True适配日/月/年的格式) df['A'] = pd.to_datetime(df['A'], dayfirst=True)
2. 方法一:用groupby+transform+loc实现(解决你的loc困惑)
# 对每个B组,计算该组的最新日期,并把结果映射到每一行 group_max_date = df.groupby('B')['A'].transform('max') # 用loc筛选出A列等于所在组最新日期的行 df_filtered = df.loc[df['A'] == group_max_date]
为什么用transform? 直接groupby('B')['A'].max()只会得到每个B对应一个日期,没法直接和原DataFrame的行匹配。transform会把分组计算的结果广播回原数据的每一行,这样每一行都能拿到自己所在组的最新日期,再用loc筛选就顺理成章了。
3. 方法二:更简洁的排序+去重
# 先按B列升序、A列降序排序,这样每个B组的第一行就是最新日期 df_filtered = df.sort_values(['B', 'A'], ascending=[True, False]) # 保留每个B组的第一行,自动删除重复的旧日期行 df_filtered = df_filtered.drop_duplicates('B').reset_index(drop=True)
最终结果
A B E 0 2023-12-26 apple 7,9 1 2023-12-26 pear 28,6 2 2022-12-26 orange 33,3 3 2023-12-26 wildberry 24,7 4 2023-12-26 grapes 17,1
内容的提问来源于stack exchange,提问作者user23491012
相关产品推荐
相关产品推荐

