如何为Pandas DataFrame中的多级索引指定对应值?
问题:如何正确为Pandas多级索引DataFrame指定值?
我希望使用多级索引构建Pandas DataFrame,首先定义数据框列:
df = pd.DataFrame(columns=["val",])
接着生成索引元组和对应值:
for j in range(1,5): tuples = [(str(j), i) for i in range(10)] vals = [0,1,2,3,j,j,4,4,1,1]
我想在循环中高效更新数据,得知.loc方法比_append更高效,尝试用:
for i2, el in enumerate(tuples): df.loc[el] = vals[i2] #el is a tuple
但结果不符合预期,执行df.loc[('1', 3)] = 4时,得到的DataFrame为:
val 3 1 NaN 4.0
而我期望的是:
val 1 3 4.0
请问如何正确为Pandas DataFrame中的多级索引指定值?
解决方案
问题根源
你之前的代码出错,是因为初始化df时没有指定多级索引(MultiIndex)。当你用元组('1',3)作为.loc的索引时,Pandas会默认把元组的第一个元素当作行索引,第二个元素当作列名,因此才会出现新增列3的错误结果。
正确做法
方法1:先收集所有数据,一次性构建DataFrame(最高效)
避免循环更新的开销,先把所有索引元组和对应值收集起来,再一次性创建带多级索引的DataFrame:
import pandas as pd all_indices = [] all_values = [] for j in range(1, 5): # 生成当前批次的索引元组和值 batch_indices = [(str(j), i) for i in range(10)] batch_values = [0,1,2,3,j,j,4,4,1,1] # 合并到总列表 all_indices.extend(batch_indices) all_values.extend(batch_values) # 创建多级索引 multi_idx = pd.MultiIndex.from_tuples(all_indices, names=['level_1', 'level_2']) # 构建最终DataFrame df = pd.DataFrame({'val': all_values}, index=multi_idx)
方法2:循环更新(需先初始化带多级索引的空DataFrame)
如果必须用循环更新,要先初始化一个带有空多级索引的DataFrame,确保Pandas能识别元组为多级索引:
import pandas as pd # 初始化带空多级索引的DataFrame df = pd.DataFrame( {'val': []}, index=pd.MultiIndex.from_tuples([], names=['level_1', 'level_2']) ) for j in range(1, 5): batch_indices = [(str(j), i) for i in range(10)] batch_values = [0,1,2,3,j,j,4,4,1,1] # 循环更新每个索引对应的值 for idx, val in zip(batch_indices, batch_values): df.loc[idx, 'val'] = val
验证效果
执行df.loc[('1', 3)] = 4后,查看结果:
print(df.loc[('1', 3)])
输出会符合预期:
val 4.0 Name: (1, 3), dtype: float64
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

