当前位置: 首页 > 面试题库 >

在单一级别的MultiIndex上合并

潘宝
2023-03-14
问题内容

有什么方法可以在不重置索引的情况下在MultiIndex的单个级别上进行合并?

我有一个由ObjectID索引的时不变值的“静态”表,而我有一个由ObjectID + Date索引的时变字段的“动态”表。我想将这些表连接在一起。

现在,我能想到的最好的是:

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True)

但是,动态表非常大,我不想为了合并值而随意修改其索引。


问题答案:

是的,从pandas 0.14.0开始,现在可以使用将单个索引的DataFrame与多索引的DataFrame级别合并.join

df1.join(df2, how='inner') # how='outer' keeps all records from both data frames

0.14 pandas文档将其描述为等效的,但比以下方法具有更高的内存效率和更快的内存:

merge(df1.reset_index(),
      df2.reset_index(),
      on=['index1'],
      how='inner'
     ).set_index(['index1','index2'])

文档还提到.join不能用于在单个级别上合并两个多索引的DataFrame,并且从上一期的GitHub跟踪器讨论中可以看出,实现此优先级似乎不高:

所以我合并为单个联接,请参见#6363; 以及有关如何进行多-
多联接的一些文档。实际实现起来相当复杂。和恕我直言,不值得付出努力,因为它实际上根本不会改变太多的内存使用/速度。

但是,与此相关的是GitHub对话,最近有一些开发https://github.com/pydata/pandas/issues/6360。也可以通过重置索引来实现此目的,如前所述,文档中也有描述。

现在可以将多索引数据帧彼此合并。根据发行说明:

index_left = pd.MultiIndex.from_tuples([('K0', 'X0'), ('K0', 'X1'),
                                        ('K1', 'X2')],
                                        names=['key', 'X'])

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']}, index=index_left)

index_right = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'),
                                        ('K2', 'Y2'), ('K2', 'Y3')],
                                        names=['key', 'Y'])

right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']}, index=index_right)

left.join(right)

出:

            A   B   C   D
key X  Y                 
K0  X0 Y0  A0  B0  C0  D0
    X1 Y0  A1  B1  C0  D0
K1  X2 Y1  A2  B2  C1  D1

[3 rows x 4 columns]


 类似资料:
  • 问题内容: 经过一些分组后,我创建了一个具有MultiIndex的DataFrame: 如何在MultiIndex前面添加一个级别,以便将其转换为类似以下内容: 问题答案: 一种使用以下代码完成此操作的好方法: 甚至更短的方法: 这可以推广到许多数据框架,请参阅docs。

  • 问题内容: 可以说我有一个DataFrame如下: 我想创建一个新的DataFrame像这样: 可能的代码是什么? 问题答案: 1.使用Python 3.6+更新,使用带有列表理解功能的f字符串格式: 2.使用和: 3.如果您的列具有数字数据类型,请使用和: 输出:

  • 我在linux服务器上的一个备份中遇到了一个问题,它以某种方式将文件的所有文件夹向下移动了一个级别,放入了一个同名的新文件夹。我想将所有文件返回到其原始位置。许多文件的名称中有空格,使事情复杂化。 原始目录结构: 目录结构不正确: 请注意,我不希望子文件夹中的文件移动到文件夹1中,但我确实希望子文件夹本身向上移动一级。 我尝试了一些类似的命令,基于这里一些相关的线程,但没有成功,而是尝试将文件移动

  • 问题内容: 我有3个级别的MultiIndex的熊猫数据框。我试图根据与两个级别相对应的值列表来提取此数据框的行。 我有这样的事情: 现在,我要获取索引级别为“ b”和“ c”的所有行: 即值的具有或在水平和分别为:。 所以我想在第一级上学习一个,并在第二级和第三级上提取特定的元组。 最初,我认为将多索引对象传递给.loc会拉出我想要的值/级别,但这是行不通的。做这样的事情的最好方法是什么? 问题

  • 我正在构建一个文本语音应用程序。我正在使用splitpane来显示它。左窗格显示动态变化的语音到文本信息。右窗格显示一个“是/否”固定文本为每个句子说在左窗格在同一级别。 为了确保“Yes/No”显示在与左窗格中的句子完全相同的级别上,每当说出新句子时,我将在左窗格和右窗格中添加文本到相应的HBox(Splitpane_left_hbox(语音到文本句子)和Splitpane_right_hbox

  • 我想知道是否有一种简单的方法可以从特定的窗口获得所有的顶层,包括顶层内的顶层。在下面的代码中,我留下了一个我想做的例子: Tkinter中是否有实现这一点的内置功能?