首页 > 解决方案 > 将数据分配给多索引数据帧的切片

问题描述

我有一个看起来像这样的多索引数据框:

iterables = [['House1','House2'],['cats','dogs','birds','hamsters']]
index = pandas.MultiIndex.from_product(iterables,names=['House','pets'])
df_pets = pandas.DataFrame(index=index,columns=['Number'])
print(df_pets)

                Number
House  pets           
House1 cats        NaN
       dogs        NaN
       birds       NaN
       hamsters    NaN
House2 cats        NaN
       dogs        NaN
       birds       NaN
       hamsters    NaN

现在,我想使用来自第二个数据帧的数据将数据分配给这个数据帧,由

df_house1 = pandas.DataFrame([1,2],index=['cats','dogs'],columns=['Number'])
print(df_house1)

      Number
cats       1
dogs       2

这篇文章看起来我应该能够使用assign

idx = pandas.IndexSlice
df1 = df_pets.loc[idx['House1'],:].assign(Number=df_house1['Number'])
print(df1)

          Number
pets            
cats         1.0
dogs         2.0
birds        NaN
hamsters     NaN

这成功地匹配了索引,这是我的主要目标,因为我可能缺少数据。(为什么它会改变数据类型是个谜)。

我的问题是,如何更新原始 DataFrame df_pets?这是我完成明显任务时得到的结果。

df_pets.loc[idx['House1'],:] = df1
print(df_pets)

                Number
House  pets           
House1 cats        NaN
       dogs        NaN
       birds       NaN
       hamsters    NaN
House2 cats        NaN
       dogs        NaN
       birds       NaN
       hamsters    NaN

我在上面引用的帖子中读到可能存在类型不匹配。但是我检查了原始数据框和包含我要用于分配的数据的类型:

print(df1.index.dtype)
print(df_pets.index.dtype)

object
object

我错过了什么?或者,也许还有另一种方法可以将数据分配给多索引数据帧的一部分?

标签: pythonpandasdataframemulti-index

解决方案


您可以尝试通过 ndarray 分配它

df_pets.loc[idx['House1', df_house1.index.tolist()],:] = df_house1.values

Out[296]:
                Number
House  pets
House1 cats          1
       dogs          2
       birds       NaN
       hamsters    NaN
House2 cats        NaN
       dogs        NaN
       birds       NaN
       hamsters    NaN

推荐阅读