是否可以合并具有一系列不同长度的多维数据框? 组合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 那么,如何合并多维数据框和一系列不同长度的数据呢?
答案 0 :(得分:2)
您可以将DataFrame.join
与rename
和参数on
一起使用,然后将DataFrame.set_index
与DataFrame.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