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

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.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

【讨论】:

感谢您的帮助。我都试过了。第一个 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 数据集。 (视频数据)

合并 pandas 中列名不同且长度不同的两个数据框

在python中合并具有不同长度和列的数据框列表

熊猫在不同长度的列上合并两个数据框

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

在Python中合并不同长度的数据帧。