如何一次性向MultiIndex DataFrame中添加多行数据?
高效批量添加MultiIndex DataFrame行数据的方法
核心思路:批量构造新数据块后合并,替代循环赋值
循环逐个添加的问题在于,每次df.loc赋值都会触发DataFrame的副本创建,数据量越大性能损耗越严重。正确做法是一次性构造所有待添加的行数据,通过合并操作完成批量插入,彻底避免多次副本开销。
具体实现步骤
构造与原数据结构一致的新数据块:
针对s3的t1试验、事件序列events = [5,6,7],我们先生成对应MultiIndex的元组,再创建独立的DataFrame:import pandas as pd # 原数据(用户提供) tuples = [ ('s1', 't1', 0, 1, 11), ('s1', 't2', 0, 4, 14), ('s1', 't2', 1, 5, 15), ('s2', 't1', 0, 6, 16), ('s2', 't1', 1, 7, 17), ('s2', 't2', 0, 8, 18), ('s2', 't3', 0, 9, 19), ] df = pd.DataFrame.from_records(tuples, index=['subject', 'trial', 'event'], columns=['subject', 'trial', 'event', 'A', 'B']) # 待添加的新数据 events = [5,6,7] target_subject = 's3' target_trial = 't1' # 生成新数据的元组列表(B列暂设为None,后续可补充) new_data_tuples = [(target_subject, target_trial, idx, val, None) for idx, val in enumerate(events)] # 创建新DataFrame,保持与原数据一致的索引层级和列结构 new_df = pd.DataFrame.from_records(new_data_tuples, index=['subject', 'trial', 'event'], columns=['subject', 'trial', 'event', 'A', 'B']) # 合并原DataFrame与新DataFrame df = pd.concat([df, new_df]) # 可选:排序索引,维持原有层级顺序 df = df.sort_index() print(df)输出结果:
A B subject trial event s1 t1 0 1 11.0 t2 0 4 14.0 1 5 15.0 s2 t1 0 6 16.0 1 7 17.0 t2 0 8 18.0 t3 0 9 19.0 s3 t1 0 5 NaN 1 6 NaN 2 7 NaN
后续补充与扩展
- 若后续获取到
s3的t1试验中B列的数据,可直接通过已存在的索引批量赋值(此时不会触发KeyError):b_events = [25,26,27] df.loc[('s3', 't1', slice(None)), 'B'] = b_events - 这种合并方式能完美保留MultiIndex的层级结构,方便后续做子集对比分析,比如用
df.xs('s1', level='subject')筛选单个受试者数据,或用df.loc[('s1', 't1'), :]定位特定试验的A、B数据做对比。
内容的提问来源于stack exchange,提问作者Fritz
相关产品推荐
相关产品推荐

