将数据框添加到multindex数据框

时间:2018-08-08 21:31:34

标签: python pandas dataframe multidimensional-array

我正在尝试为多个不同指标创建一个具有多个标识符的历史时间序列,作为该过程的一部分,我正在尝试创建多索引数据框,然后用各个数据框“填充”它。

多索引:

                   ID1                 ID2
             ITEM1      ITEM2     ITEM1      ITEM2 
index                                                    

要插入的数据框

      ITEM1        ITEM2 
Date

a
b
c
通过查看官方文档和该网站,我发现以下相关内容: Add single index data frame to multi index data frame, Pandas, Python以及相关的熊猫官方文档页面: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html https://pandas.pydata.org/pandas-docs/stable/advanced.html

我管理过类似的东西:

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) 

返回一个Cannot set框架,该框架没有定义的索引并且值不能转换为Series 从环顾四周我的理解是,这是因为我实际上将数据框的一半留空了(参差不齐的列表?)

任何对如何迭代填充多索引DF的帮助将不胜感激。

让我知道我是否错过了相关信息,

欢呼。

1 个答案:

答案 0 :(得分:0)

设置

df1 = pd.DataFrame(
    [[1, 2, 3, 4, 5, 6] * 2] * 3,
    columns=pd.MultiIndex.from_product(['ID1 ID2 ID3'.split(), range(4)])
)

df2 = df1.ID1 * 2

df1

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

df2

    0  1  2  3
0   2  4  6  8
1   2  4  6  8
2   2  4  6  8

问题在于Pandas试图对索引(在这种情况下为列)进行排队。我们可以做一些转置/连接欺骗,但是我宁愿避免这种情况。

选项1

利用以下事实:只要形状匹配,我们就可以通过loc分配数组。好吧,我们最好确保它正确并且列和索引的顺序正确。我将alignright参数一起使用来执行此操作。然后分配对齐的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

stackassignunstack结合使用的创造性方式

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