合并两个以索引为字符串的熊猫数据帧

时间:2020-01-31 19:04:07

标签: python pandas dataframe insert

这里是2个熊猫数据帧,其中索引是字符串:

df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]], columns=list('AB'))
df.index = ['Tax1','Tax2','Tax1','Tax2']

df2 = pd.DataFrame([[0, 0], [1, 1]], columns=list('AB'))
df2.index = ['Tax3','Tax3']

给出df:

enter image description here

以及df2:

enter image description here

有没有一种简单的方法可以将df2的行插入df中?

enter image description here

无需将索引字符串移回数字并使用df.loc ['k']吗? 我最近去过的地方是append,它将df2的两行放在df的末尾,而不是我要查找的内容...

1 个答案:

答案 0 :(得分:2)

您可以:

  • 将顶级索引添加到 df (前2行为 1 2 (最后2行),然后将结果保存到例如 wrk1
  • df2 中添加顶级索引(第一行为 1 2 用于第二行),并将结果保存到例如 wrk2
  • 将以上两个DataFrame串联起来。
  • 按MultiIndex排序并放下其顶层。

执行此操作的代码是:

wrk1 = pd.concat([df.iloc[0:2], df.iloc[2:4]], keys=(1, 2))
wrk2 = pd.concat([df2[0:1], df2[1:2]], keys=(1,2))
result = pd.concat([wrk1, wrk2]).sort_index().reset_index(level=0, drop=True)

要考虑的细节:生成的DataFrame包含非唯一 索引中的条目,所以也许您应该离开索引的顶层 (您的选择)。

按照您的问题进行编辑

让我们看看中间结果:

  1. wrk1 - df 的前2行,索引== 1 ,后2行 索引== 2

            A  B
    1 Tax1  1  2
      Tax2  3  4
    2 Tax1  5  6
      Tax2  7  8
    
  2. wrk2 - df2 中的第一行,索引== 1 ,第二行 索引== 2

            A  B
    1 Tax3  0  0
    2 Tax3  1  1
    

生成结果的一个选项是其“不完整”版本(不包含 reset_index ):

pd.concat([wrk1, wrk2]).sort_index()

它给出以下结果:

        A  B
1 Tax1  1  2
  Tax2  3  4
  Tax3  0  0
2 Tax1  5  6
  Tax2  7  8
  Tax3  1  1

这里您有 2个级别的索引:

  • 顶级- 1 2
  • 第二级-从源数据框架复制,

因此,从顶层您可以看到特定行的“源” (第一或第二子集),并且每一行都有唯一索引。

第二个(完整)选项是:

pd.concat([wrk1, wrk2]).sort_index().reset_index(level=0, drop=True)

它给出了您想要的:

      A  B
Tax1  1  2
Tax2  3  4
Tax3  0  0
Tax1  5  6
Tax2  7  8
Tax3  1  1

(没有最高的多索引级别)。