如何在Pandas多层索引DataFrame中追加指定索引的DataFrame
Pandas多层索引DataFrame追加数据的正确方法
问题说明
现有一个多层索引的DataFrame:
import pandas as pd index = pd.MultiIndex.from_product([["A", "B"], ["AA", "BB"]]) columns = ["X", "Y"] df = pd.DataFrame([[1,2],[5,8],[1,2],[5,8]], index = index, columns = columns)
输出结果:
X Y A AA 1 2 BB 5 8 B AA 1 2 BB 5 8
需要将另一个普通索引的DataFrame追加到上述DataFrame中,使其外层索引为C:
df2 = pd.DataFrame([[1,4], [5,6]], index = ["AAA", "BBB"], columns = columns)
输出结果:
X Y AAA 1 4 BBB 5 6
期望最终得到的结果为:
X Y A AA 1 2 BB 5 8 B AA 1 2 BB 5 8 C AAA 1 4 BBB 5 6
直接使用df.loc['C',:] = df2无法得到预期结果,会出现NaN值:
X Y A AA 1.0 2.0 BB 5.0 8.0 B AA 1.0 2.0 BB 5.0 8.0 C NaN NaN
正确实现方法
方法1:为df2构建多层索引后拼接
先将df2的索引转换为包含外层C的多层索引,再与原df拼接:
# 为df2创建多层索引 df2_multi = df2.set_index(pd.MultiIndex.from_tuples([("C", idx) for idx in df2.index])) # 拼接两个DataFrame result = pd.concat([df, df2_multi])
方法2:利用pd.concat的keys参数简化操作
通过keys参数直接为df2指定外层索引,无需手动构造多层索引:
result = pd.concat([df, df2], keys=["", "C"]).droplevel(0)
这里keys=["", "C"]表示原df保留原有索引结构,df2的外层索引设为C,最后通过droplevel(0)移除原df新增的空索引层,得到目标结构。
方法3:使用append(已弃用,不推荐)
如果仍习惯使用append方法,同样需要先为df2构造多层索引:
df2_multi = df2.set_index(pd.MultiIndex.from_tuples([("C", idx) for idx in df2.index])) result = df.append(df2_multi)
注意:append方法在Pandas 2.0及以上版本已被弃用,官方推荐使用pd.concat替代。
内容的提问来源于stack exchange,提问作者Himanshu Poddar
相关产品推荐
相关产品推荐

