如何获取DataFrame中各Object分组对应的缺失Period值
Python Pandas 实现方案
首先导入依赖并构造测试数据:
import pandas as pd # 构造示例DataFrame,实际使用时替换为你的数据读取逻辑 data = { 'Object': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Period': [202101, 202102, 202103, 202105, 202107, 202102, 202103, 202104, 202106] } df = pd.DataFrame(data)
通用实现(支持跨年场景,推荐使用)
通过转成Pandas月度周期类型处理,避免跨年时月份序列不连续的问题:
# 将Period转为月度周期类型 df['Period'] = pd.to_datetime(df['Period'].astype(str), format='%Y%m').dt.to_period('M') # 定义计算缺失月份的自定义函数 def calc_missing_periods(group_series): # 生成分组内最小到最大日期的完整月度序列 full_periods = pd.period_range(start=group_series.min(), end=group_series.max(), freq='M') # 求差集得到缺失的月份,转为YYYYMM格式后拼接 missing_list = full_periods[~full_periods.isin(group_series)].strftime('%Y%m').tolist() return ' / '.join(missing_list) # 按Object分组聚合得到结果 result_df = df.groupby('Object')['Period'].apply(calc_missing_periods).reset_index(name='MissingValues')
简易实现(仅适用于同一年的月份场景)
如果确认所有Period都属于同一年,直接用整数范围处理即可:
def calc_missing_periods_simple(group_series): min_p = group_series.min() max_p = group_series.max() missing = [str(p) for p in range(min_p, max_p + 1) if p not in group_series.values] return ' / '.join(missing) result_df = df.groupby('Object')['Period'].apply(calc_missing_periods_simple).reset_index(name='MissingValues')
运行后输出的result_df就是你需要的目标格式,打印结果如下:
Object MissingValues 0 A 202104 / 202106 1 B 202105
内容的提问来源于stack exchange,提问作者ImFabien75
相关产品推荐
相关产品推荐

