我正在尝试为多个不同指标创建一个具有多个标识符的历史时间序列,作为该过程的一部分,我正在尝试创建多索引数据框,然后用各个数据框“填充”它。
多索引:
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的帮助将不胜感激。
让我知道我是否错过了相关信息,
欢呼。
答案 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试图对索引(在这种情况下为列)进行排队。我们可以做一些转置/连接欺骗,但是我宁愿避免这种情况。
利用以下事实:只要形状匹配,我们就可以通过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
或者,我们可以给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
将stack
和assign
与unstack
结合使用的创造性方式
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