Python 向多索引数据帧添加数据帧

Python 向多索引数据帧添加数据帧,python,pandas,dataframe,multidimensional-array,Python,Pandas,Dataframe,Multidimensional Array,我试图为许多不同的指标创建一个由许多标识符组成的历史时间序列,作为其中的一部分,我试图创建多索引数据帧,然后用各个数据帧“填充” 多索引: ID1 ID2 ITEM1 ITEM2 ITEM1 ITEM2 index 要插入的数据帧 ITEM1

我试图为许多不同的指标创建一个由许多标识符组成的历史时间序列,作为其中的一部分,我试图创建多索引数据帧,然后用各个数据帧“填充”

多索引:

                   ID1                 ID2
             ITEM1      ITEM2     ITEM1      ITEM2 
index                                                    
要插入的数据帧

      ITEM1        ITEM2 
Date

a
b
c
通过查阅官方文件和本网站,我发现以下相关信息: 以及相关的熊猫官方文档页面:

我已经设法做到了以下几点:

for i in df1.index: 
for j in df2.columns:
    df1.loc[i,(ID,j)]=df2.loc[i,j]
但是,当我需要在大约100个数据帧上执行此操作时,它似乎非常低效

由于某种原因,一个简单的

df1.loc[i,(ID)]=df2.loc[i] doesn't seem to work 
也没有:

df1[ID1]=df1.append(df2) 
返回无法设置没有定义索引的帧和无法转换为序列的值 环顾四周,我的理解是,这是因为我实际上留下了一半的数据帧为空(不完整的列表?)

任何关于如何迭代填充我的多索引DF的帮助都将不胜感激

如果我错过了相关信息,请告诉我

干杯。

设置


问题是Pandas正在尝试排列索引(本例中为列)。我们可以做一些转置/连接技巧,但我宁愿避免

选择1 只要形状匹配,我们就可以通过
loc
分配一个数组。好的,我们最好确保它是正确的,并且列和索引的顺序是正确的。我使用
align
right
参数来执行此操作。然后分配对齐的
df2

df1.loc[:, 'ID1'] = df2.align(df1.ID1, 'right')[0].values
df1

  ID1          ID2          ID3         
    0  1  2  3   0  1  2  3   0  1  2  3
0   2  4  6  8   5  6  1  2   3  4  5  6
1   2  4  6  8   5  6  1  2   3  4  5  6
2   2  4  6  8   5  6  1  2   3  4  5  6

选择2 或者,我们可以为
df2
提供我们需要的额外的列索引级别。使用
update
将相关单元格替换到位

df1.update(pd.concat({'ID1': df2}, axis=1))
df1

  ID1          ID2          ID3         
    0  1  2  3   0  1  2  3   0  1  2  3
0   2  4  6  8   5  6  1  2   3  4  5  6
1   2  4  6  8   5  6  1  2   3  4  5  6
2   2  4  6  8   5  6  1  2   3  4  5  6

选择3 创造性地使用
堆栈
分配
以及
取消堆栈

df1.stack().assign(ID1=df2.stack()).unstack()

  ID1          ID2          ID3         
    0  1  2  3   0  1  2  3   0  1  2  3
0   2  4  6  8   5  6  1  2   3  4  5  6
1   2  4  6  8   5  6  1  2   3  4  5  6
2   2  4  6  8   5  6  1  2   3  4  5  6

嗨@piRSquared,忘了我之前的评论,找到了一个很好的方法来实现你的更新concat建议。这很有效,并且很容易迭代来填充我的数据框架,现在找到一种方法来确保索引对齐!再次感谢您的及时帮助
import numpy as np import pandas as pd df1=pd.DataFrame(columns=pd.MultiIndex.from_product(['ID1 ID2 ID3'.split(),range(4)])df2=pd.DataFrame([[1,2,3,4]]*3,columns=range(4))df1=df1.append(pd.concat({'ID1':df2},axis=1))
PS:为糟糕的格式道歉,因为我不熟悉stackoverflow,有点笨拙。
df1.loc[:, 'ID1'] = df2.align(df1.ID1, 'right')[0].values
df1

  ID1          ID2          ID3         
    0  1  2  3   0  1  2  3   0  1  2  3
0   2  4  6  8   5  6  1  2   3  4  5  6
1   2  4  6  8   5  6  1  2   3  4  5  6
2   2  4  6  8   5  6  1  2   3  4  5  6
df1.update(pd.concat({'ID1': df2}, axis=1))
df1

  ID1          ID2          ID3         
    0  1  2  3   0  1  2  3   0  1  2  3
0   2  4  6  8   5  6  1  2   3  4  5  6
1   2  4  6  8   5  6  1  2   3  4  5  6
2   2  4  6  8   5  6  1  2   3  4  5  6
df1.stack().assign(ID1=df2.stack()).unstack()

  ID1          ID2          ID3         
    0  1  2  3   0  1  2  3   0  1  2  3
0   2  4  6  8   5  6  1  2   3  4  5  6
1   2  4  6  8   5  6  1  2   3  4  5  6
2   2  4  6  8   5  6  1  2   3  4  5  6