如何合并多维数据框和不同长度的系列?
Posted
技术标签:
【中文标题】如何合并多维数据框和不同长度的系列?【英文标题】:How to merge multidimensional dataframe and series of different length? 【发布时间】:2019-08-05 06:03:48 【问题描述】:有没有办法合并一系列不同长度的多维数据框? 有很多方法可以组合 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])
这导致在我想查看 cnts 的每一列中都有一个带有 NAN 的数据框。
然后我尝试了:
result = pd.merge(df, s1)
我得到了: 无法将 DataFrame 与类型的实例合并
我用各种各样的论据尝试了所有这些,但我认为展示我尝试过的所有东西都没有帮助?我想我尝试了很多,因为我并不真正了解合并多维数据框和一系列不同长度的工作原理。
我看过相关的问题,但所有问题都只有一个级别的数据框,例如:How to merge a Series and DataFrame 那么,如何合并一个多维数据框和不同长度的序列呢?
【问题讨论】:
您是否在两个数据框上都尝试了reset_index
然后加入它们?
【参考方案1】:
您可以将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
【讨论】:
感谢您的帮助。我都试过了。第一个 DataFrame.join 引发错误:KeyError: 'Pet'。 Index.map 抛出另一个错误:“系列”对象不可调用 @Hibisceae - 将idx = df.index.get_level_values('Pet').map(s1).rename('cnts')
更改为 idx = df.index.get_level_values('Pet').map(s1.get).rename('cnts')
@Hibisceae - 这是一些较旧的熊猫版本的问题,如果使用最后一个0.24+
,它也可以在没有.get
的情况下工作。
就是这样!它抛出:'numpy.ndarray' 对象没有属性'rename',解决方法:s1 = s1.rename('cnts')
然后 idx = df.index.get_level_values('Pet').map(s1.get) result = df.set_index(idx, append=True).reorder_levels([0,2,1]) 问题解决了。谢谢!
@Hibisceae - 是的,它和idx = df.index.get_level_values('Pet').map(s1.rename('cnts').get)
一样。谢谢,很高兴提供帮助。不要忘记接受答案,如果它适合你! :)以上是关于如何合并多维数据框和不同长度的系列?的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow:使用不同长度的多维输入数据创建 TensorFlow 数据集。 (视频数据)