python - 将数据分配给多索引数据帧的切片
问题描述
我有一个看起来像这样的多索引数据框:
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
我错过了什么?或者,也许还有另一种方法可以将数据分配给多索引数据帧的一部分?
解决方案
您可以尝试通过 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