如何在Pandas日期索引DataFrame中填充缺失行并复制前序行数据?
解决方法:构建可查询截止日期队伍球员的Pandas结构
嘿,我来帮你搞定这个需求!你想要的是构建一个可以快速查询「截止指定日期,某支队伍最后归属的所有球员」的结构,核心是处理那些后续日期没有队伍数据时自动沿用之前的球员名单对吧?下面一步步来实现:
步骤1:准备示例数据
首先把你给出的示例转成Pandas DataFrame:
import pandas as pd # 你的示例数据 data = { 'DATE': [0, 0, 0, 0, 1, 1, 1, 2], 'TEAM': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'A'], 'PLAYER': ['John', 'Tom', 'Chris', 'Rob', 'John', 'George', 'Chris', 'Rob'] } df = pd.DataFrame(data)
步骤2:按日期+队伍分组,合并球员列表
我们先把同一日期、同一队伍的球员合并成一个列表,这样每个日期-队伍组合对应唯一的球员集合:
# 分组并将球员转为列表 grouped = df.groupby(['DATE', 'TEAM'])['PLAYER'].apply(list).reset_index()
步骤3:补全所有日期-队伍组合
原数据里有些日期没有部分队伍的数据(比如DATE=2时没有B队的记录),我们需要生成所有可能的日期-队伍组合,确保每个日期都包含所有队伍的条目:
# 获取所有唯一日期和队伍 all_dates = df['DATE'].unique() all_teams = df['TEAM'].unique() # 创建日期-队伍的笛卡尔积索引 multi_index = pd.MultiIndex.from_product([all_dates, all_teams], names=['DATE', 'TEAM']) # 重新索引,补全缺失的组合 full_df = grouped.set_index(['DATE', 'TEAM']).reindex(multi_index).reset_index()
步骤4:向前填充缺失的球员数据
现在补全后的DataFrame里会有缺失值(比如DATE=2、TEAM=B的PLAYER列是NaN),我们按队伍分组,用**向前填充(ffill)**的方式让缺失的日期继承上一个日期的球员名单:
# 按队伍分组,对球员列向前填充 full_df['PLAYER'] = full_df.groupby('TEAM')['PLAYER'].ffill()
步骤5:构建可查询的对象X
最后把处理好的数据设置成DATE和TEAM的多索引,这样就能用X.loc[date, team]直接查询了:
X = full_df.set_index(['DATE', 'TEAM'])
测试查询效果
现在试试你的查询需求:
X.loc[0, 'A']→ 输出['John', 'Tom']X.loc[1, 'B']→ 输出['Chris']X.loc[2, 'B']→ 输出['Chris'](自动填充了DATE=1时B队的球员)X.loc[2, 'A']→ 输出['Rob']
这个方法不管你的日期是连续还是非连续的都适用,只要是原数据里存在的日期,都会自动补全所有队伍的球员数据~
内容的提问来源于stack exchange,提问作者rwolst
相关产品推荐
相关产品推荐

