如何为Pandas DataFrame分组补充缺失的Anger、Happiness行?
解决方法
要实现这个需求,我们可以通过构建时间戳分组与必填情绪的笛卡尔积,再和原始数据合并填充的方式来完成,步骤清晰且高效:
步骤1:准备原始数据
首先把你提供的数据转换成Pandas DataFrame:
import pandas as pd data = [ [1555414708025, 1555414723279, 'Valence', 2], [1555414708025, 1555414723279, 'Arousal', 6], [1555414708025, 1555414723279, 'Dominance', 2], [1555414708025, 1555414723279, 'Sadness', 1], [1555414813304, 1555414831795, 'Valence', 3], [1555414813304, 1555414831795, 'Arousal', 5], [1555414813304, 1555414831795, 'Dominance', 2], [1555414813304, 1555414831795, 'Sadness', 1], [1555414921819, 1555414931382, 'Valence', 1], [1555414921819, 1555414931382, 'Arousal', 7], [1555414921819, 1555414931382, 'Dominance', 2], [1555414921819, 1555414931382, 'Sadness', 1], [1555414921819, 1555414931382, 'Anger', 1] ] df = pd.DataFrame(data, columns=['start_timestamp_milli', 'end_timestamp_milli', 'name', 'rating'])
步骤2:生成必填情绪的全量分组数据
我们需要确保每个时间戳分组都包含Anger和Happiness,先提取所有唯一的时间戳组合,再和必填情绪做笛卡尔积:
# 定义需要确保存在的情绪名称 required_names = ['Anger', 'Happiness'] # 获取所有唯一的时间戳分组(start+end的组合) unique_groups = df[['start_timestamp_milli', 'end_timestamp_milli']].drop_duplicates() # 生成笛卡尔积:每个时间分组都对应所有必填情绪 required_rows = unique_groups.assign(key=1).merge(pd.DataFrame({'name': required_names, 'key': 1}), on='key').drop('key', axis=1)
步骤3:合并数据并填充缺失值
把原始数据和刚生成的必填行合并,去重保留原始数据已有的行,最后把缺失的rating填充为0:
# 合并原始数据与必填行 combined_df = pd.concat([df, required_rows], ignore_index=True) # 去重:保留每个(时间分组+情绪)的第一行(原始数据行会优先保留) combined_df = combined_df.drop_duplicates(subset=['start_timestamp_milli', 'end_timestamp_milli', 'name'], keep='first') # 填充缺失的rating为0,并转为整数类型 combined_df['rating'] = combined_df['rating'].fillna(0).astype(int) # 可选:按时间分组和情绪排序,让结果更整齐 combined_df = combined_df.sort_values(by=['start_timestamp_milli', 'name']).reset_index(drop=True)
最终效果
运行完代码后,combined_df就会和你期望的结果完全一致:每个时间分组都包含Anger和Happiness,已存在的情绪保留原评分,新增的情绪评分自动设为0。
方法优势
- 避开了循环分组处理,数据量大时效率更高
- 逻辑直观,通过笛卡尔积确保所有必填情绪覆盖到每个时间分组
- 去重步骤保证原始数据不会被覆盖,仅补充缺失项
内容的提问来源于stack exchange,提问作者machinery
相关产品推荐
相关产品推荐

