看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
根据 ID 进行分组,找到每组中的Date的最大日期后,再找到Due_Date的最大日期。如结果有多条数据,则返回多条(编号1002)。如某一编号的所有Date值均为空,则该部分数据全部保留,再从Due_Date中找到最大值(编号1004)。实际情况需要从七八列中筛选后,得到最终结果。
以下为样例原数据:
# 原始数据
'''
ID Date Due_Date
1001 3/9/2022 3/30/2022
1001 6/14/2022 7/27/2022
1001 6/14/2022 7/13/2022
1001 5/19/2022 8/9/2022
1001 2/9/2022 4/20/2022
1002 11/5/2021 12/25/2021
1002 11/5/2021 12/25/2021
1002 9/17/2021 12/23/2021
1002 9/16/2021 12/4/2021
1002 8/11/2021 8/29/2021
1002 5/5/2021 6/29/2021
1003 8/8/2021 9/12/2021
1003 8/16/2021 10/16/2021
1003 9/29/2021 11/28/2021
1003 12/19/2021 2/5/2022
1004 3/7/2022
1004 3/8/2022
1005 3/12/2022
1005 3/12/2022
'''
读取数据:
import pandas as pd
df = pd.read_clipboard()
# 字段转为时间
df = df.astype({'Date': 'M8[ns]', 'Due_Date': 'M8[ns]'})
df
'''
ID Date Due_Date
0 1001 2022-03-09 2022-03-30
1 1001 2022-06-14 2022-07-27
2 1001 2022-06-14 2022-07-13
3 1001 2022-05-19 2022-08-09
4 1001 2022-02-09 2022-04-20
5 1002 2021-11-05 2021-12-25
6 1002 2021-11-05 2021-12-25
7 1002 2021-09-17 2021-12-23
8 1002 2021-09-16 2021-12-04
9 1002 2021-08-11 2021-08-29
10 1002 2021-05-05 2021-06-29
11 1003 2021-08-08 2021-09-12
12 1003 2021-08-16 2021-10-16
13 1003 2021-09-29 2021-11-28
14 1003 2021-12-19 2022-02-05
15 1004 NaT 2022-03-07
16 1004 NaT 2022-03-08
17 1005 2022-03-12 NaT
18 1005 2022-03-12 NaT
'''
以下为代码过程。
# 测试:处理单个分组数据,得到要保留的索引值
(
df.groupby('ID')
.get_group(1004)
# 对除 ID 列外的所有列从左到右降序排列
.sort_values(df.columns[1:].to_list(), ascending=False)
.drop('ID', axis=1) # 删除 ID 列
.dropna(axis=1) # 删除所有全为空的列
.iloc[:, 0] # 让不全为空的列保留在最左侧
.loc[lambda x: x == x.max()] # 取最大的值
.index # 取索引
.to_list() # 转为列表
)
# [16]
封装为函数:
# 封装为函数
def get_idxs(grp: pd.DataFrame) -> list:
# 提前删除分组列
grp = grp.drop('ID', axis=1)
return (
grp.sort_values(grp.columns.to_list(), ascending=False)
.dropna(axis=1)
.iloc[:, 0]
.loc[lambda x: x == x.max()]
.index
.to_list()
)
计算每组的索引值:
# 测试:每个分组要保留的索引行
df.groupby('ID').apply(get_idxs)
'''
ID
1001 [1, 2]
1002 [5, 6]
1003 [14]
1004 [16]
1005 [17, 18]
dtype: object
'''
合并所有索引值:
# 计算所有要保留的索引
df.groupby('ID').apply(get_idxs).sum()
# [1, 2, 5, 6, 14, 16, 17, 18]
使用索引进行筛选:
# 执行保留
df.loc[df.groupby('ID').apply(get_idxs).sum()]
'''
ID Date Due_Date
1 1001 2022-06-14 2022-07-27
2 1001 2022-06-14 2022-07-13
5 1002 2021-11-05 2021-12-25
6 1002 2021-11-05 2021-12-25
14 1003 2021-12-19 2022-02-05
16 1004 NaT 2022-03-08
17 1005 2022-03-12 NaT
18 1005 2022-03-12 NaT
'''
(完)
更新时间:2024-08-18 15:56:12 标签:pandas python 缺失值