如何合并多维数据框和不同长度的系列?

时间:2019-03-14 11:05:59

标签: python pandas dataframe merge series

是否可以合并具有一系列不同长度的多维数据框? 组合df的方法有很多。我已经读过有关联接,串联,附加和合并的信息。我不知道该使用哪个。而且,所有参数都有许多可选参数,这使得它更加难以理解。有人可以澄清文档(https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html),特别是有关如何合并数据框和不同长度的系列的文档吗?

例如,我想合并以下多维数据框,

d = {'Name': ['Kitty', 'Harry', 'Bear', 'Sam', 'Max', 'Hunter', 'Fluffy'], 'Favloc': ['couch', 'windowsill', 'bed', 'basket', 'floor', 'carpet', 'haybale'], 'Pet': ['Cat', 'Cat', 'Cat', 'Dog', 'Dog', 'Dog', 'Hamster']}
df = pd.DataFrame(data=d)
df = df.set_index(['Pet', 'Name'])

print (df)
                 Favloc
Pet     Name           
Cat     Kitty     couch
        Harry   windows
        Bear        bed
        Sam      basket
Dog     Max       floor
        Hunter   carper

具有以下系列s1:

s1 = pd.Series([3,3,1], index=['Cat','Dog','Hamster'])

我希望结果是:

                      Favloc
Pet     cnts Name           
Cat     3    Kitty     couch
             Harry   windows
             Bear        bed
             Sam      basket
Dog     3    Max       floor
             Hunter   carper
Hamster 1    Fluffy  Haybale

我已经尝试过

result = df.join(s1)

但这会引发错误:

Cannot join with no level specified and no overlapping names

我知道我没有指定级别,但是我不知道如何指定级别。我应该说1级,因为我希望cnts处于1级索引上吗? (随着Favloc处于0级? 另外,我不理解“名字不重叠”,因为猫,狗和仓鼠重叠,对吗?

我也尝试过

result = pd.concat([df, s1])

这导致在我希望看到该中心的每一列中都包含NAN的数据框。

然后我尝试:

result = pd.merge(df, s1)

我得到了: 无法将DataFrame与类型

的实例合并

我用各种参数尝试了其中的所有方法,但我认为显示所尝试的所有内容都无济于事吗?我想我做了很多尝试,因为我不太了解如何将多维数据框和一系列不同长度的数据合并。

我看过相关的问题,但是所有问题都只包含一个级别的数据帧,例如:How to merge a Series and DataFrame 那么,如何合并多维数据框和一系列不同长度的数据呢?

1 个答案:

答案 0 :(得分:2)

您可以将DataFrame.joinrename和参数on一起使用,然后将DataFrame.set_indexDataFrame.reorder_levels一起使用:

result = (df.join(s1.rename('cnts'), on='Pet')
           .set_index('cnts', append=True)
           .reorder_levels([0,2,1]))
print (result)
                      Favloc
Pet     cnts Name           
Cat     3    Kitty     couch
             Harry   windows
             Bear        bed
             Sam      basket
Dog     3    Max       floor
             Hunter   carper
Hamster 1    Fluffy  Haybale

或使用Index.map

idx = df.index.get_level_values('Pet').map(s1.rename('cnts').get)
result = df.set_index(idx, append=True).reorder_levels([0,2,1])
print (result)
                      Favloc
Pet     cnts Name           
Cat     3    Kitty     couch
             Harry   windows
             Bear        bed
             Sam      basket
Dog     3    Max       floor
             Hunter   carper
Hamster 1    Fluffy  Haybale