【发布时间】:2020-08-20 16:30:30
【问题描述】:
我无法连接具有 2 个级别的 MultiIndex DataFrames 列表,并添加第三个以区分它们。
例如,我有以下输入数据。
import pandas as pd
import numpy as np
# Input data
start = '2020-01-01 00:00+00:00'
end = '2020-01-01 02:00+00:00'
pr1h = pd.period_range(start=start, end=end, freq='1h')
midx1 = pd.MultiIndex.from_tuples([('Sup',1),('Sup',2),('Inf',1),('Inf',2)], names=['Data','Position'])
df1 = pd.DataFrame(np.random.rand(3,4), index=pr1h, columns=midx1)
df3 = pd.DataFrame(np.random.rand(3,4), index=pr1h, columns=midx1)
midx2 = pd.MultiIndex.from_tuples([('Sup',3),('Inf',3)], names=['Data','Position'])
df2 = pd.DataFrame(np.random.rand(3,2), index=pr1h, columns=midx2)
df4 = pd.DataFrame(np.random.rand(3,2), index=pr1h, columns=midx2)
所以 df1 和 df2 具有相同标签 1h 的数据,虽然它们在 Data 级别具有相同的列名,但它们在 Position 级别没有相同的列名。
df1
Data Sup Inf
Position 1 2 1 2
2020-01-01 00:00 0.660795 0.538452 0.861801 0.502479
2020-01-01 01:00 0.205806 0.847124 0.474861 0.906546
2020-01-01 02:00 0.681480 0.479512 0.631771 0.961844
df2
Data Sup Inf
Position 3 3
2020-01-01 00:00 0.758533 0.672899
2020-01-01 01:00 0.096463 0.304843
2020-01-01 02:00 0.080504 0.990310
现在,df3 和 df4 遵循相同的逻辑和相同的列名。为了将它们与 df1 和 df2 区分开来,我想使用不同的标签,例如 2h。
我想在调用pd.concat 期间添加名为Period 的第三层。为此,我尝试在pd.concat() 中使用keys 参数。我尝试了以下代码。
df_list = [df1, df2, df3, df4]
period_list = ['1h', '1h', '2h', '2h']
concatenated = pd.concat(df_list, keys=period_list, names=('Period', 'Data', 'Position'), axis=1)
但这会引发以下错误。
TypeError: int() argument must be a string, a bytes-like object or a number, not 'slice'
请问,你知道这个的正确调用是什么吗?
感谢您的帮助。最好的,
编辑 05/05
根据要求,这是所需的结果(直接从给定的答案复制。从给定答案获得的结果是我正在寻找的结果)。
Period 1h \
Data Sup Inf Sup Inf
Position 1 2 1 2 3 3
2020-01-01 00:00 0.309778 0.597582 0.872392 0.983021 0.659965 0.214953
2020-01-01 01:00 0.467403 0.875744 0.296069 0.131291 0.203047 0.382865
2020-01-01 02:00 0.842818 0.659036 0.595440 0.436354 0.224873 0.114649
Period 2h
Data Sup Inf Sup Inf
Position 1 2 1 2 3 3
2020-01-01 00:00 0.356250 0.587131 0.149471 0.171239 0.583017 0.232641
2020-01-01 01:00 0.397165 0.637952 0.372520 0.002407 0.556518 0.523811
2020-01-01 02:00 0.548816 0.126972 0.079793 0.235039 0.350958 0.705332
【问题讨论】:
-
问题不在于你一开始有多重索引,更多的是你在
period_list中有两倍相同的值。如果你一开始没有多索引,那么错误会更明确地说明问题:InvalidIndexError: Reindexing only valid with uniquely valued Index objects -
设置
period_list = ['1h', '2h', '3h', '4h']有效。否则,请发布想要的结果。 -
@Parfait 嗨,我按要求添加了预期结果。
df1和df2必须共享相同的Period,并且df3和df4也必须共享相同的Period。 -
其实和github上的这个open issue差不多
-
谢谢,我已经订阅了这个问题。如果解决了,我会修改你提出的代码。再次感谢!
标签: python pandas concatenation multi-index