PythonPandas - 连接多索引数据帧时出现类型错误。

问题描述 投票:0回答:1

我在连接一个具有2个级别的MultiIndex DataFrames列表和添加第三个级别的DataFrames来区分它们时遇到了问题。

举个例子,我有以下输入数据,所以 df1 & df2 有同一个标签的数据。

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 比如说。

我想添加这第三层名为 Period 呼叫期间 pd.concat. 为此,我正尝试使用 keys 中的参数 pd.concat(). 我尝试了以下代码。

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'

請問,有沒有什麼正確的方法可以解決這個問題?

我感谢你的帮助。Bests,

EDIT 0505

按照要求,这里是所需的结果(直接从给出的答案中复制。从给出的答案中得到的结果就是我想要的结果)。)

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
python pandas concatenation multi-index
1个回答
2
投票

一个快速的解决方法是在以下数据中使用不同的名称 period_listrename 紧接着 concat. 类似的。

df_list = [df1, df2, df3, df4]
period_list = ['1h_a', '1h_b', '2h_a', '2h_b']
concatenated = pd.concat(df_list, 
                         keys=period_list, 
                         names=('Period', 'Data', 'Position'), 
                         axis=1)\
                 .rename(columns={col:col.split('_')[0] for col  in period_list}, 
                         level='Period')

print (concatenated)
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 

编辑:因为速度问题,似乎重命名很慢,所以你可以做。

concatenated = pd.concat(df_list, 
                         keys=period_list,
                         axis=1)
concatenated.columns = pd.MultiIndex.from_tuples([(col[0].split('_')[0], col[1], col[2]) 
                                                  for col in concatenated.columns], 
                                                  names=('Period', 'Data', 'Position'), )

2
投票

考虑一个内部 concat 然后在类似的数据帧上运行最后的 concat 要把所有的人绑在一起。

concatenated = pd.concat([pd.concat([df1, df2], axis=1),
                          pd.concat([df3, df4], axis=1)],
                         keys = ['1h', '2h'],
                         names=('Period', 'Data', 'Position'),
                         axis=1)

print(concatenated)  

Period                  1h                                                    \
Data                   Sup                 Inf                 Sup       Inf   
Position                 1         2         1         2         3         3   
2020-01-01 00:00  0.189802  0.675083  0.624484  0.781774  0.453101  0.224525   
2020-01-01 01:00  0.249818  0.829180  0.190488  0.923107  0.495873  0.278201   
2020-01-01 02:00  0.602634  0.494915  0.612672  0.903609  0.426809  0.248981   

Period                  2h                                                    
Data                   Sup                 Inf                 Sup       Inf  
Position                 1         2         1         2         3         3  
2020-01-01 00:00  0.746499  0.385714  0.008561  0.961152  0.988231  0.897454  
2020-01-01 01:00  0.643730  0.365023  0.812249  0.291733  0.045417  0.414968  
2020-01-01 02:00  0.887567  0.680102  0.978388  0.018501  0.695866  0.679730
© www.soinside.com 2019 - 2024. All rights reserved.