将多个数据帧合并为一个,每个数据帧作为包含许多列的标题名,并创建一个三维数据帧

2024-05-19 10:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个数据帧df1、df2、df3等到df10。数据帧有135列。每个都是这样的:

^{tb1}$

我想将它们排列在一个数据帧中,并排堆叠在一起,但将它们的df名称作为标题。这意味着一个标题df1包含所有这些列的名称(时间、a、b…)及其下的值等等 我尝试了以下代码

   list1=['df1', 'df2', 'df3', 'df4', 'df5','df6', 'df7', 'df8', 'df9', 
   'df10']
   list2=[]
   for df in list1:
    for i in range(135):
        list2.append(df)
   A=np.array(list2)
   B = np.array([df1.columns]*10)
   C=pd.concat([df1,df2,df3,df4,df5,df6,df7,df8,df9,df10], axis=1)
   C=C.values.tolist()
   C=np.array(C)
   df = pd.DataFrame(data=C.T, columns=pd.MultiIndex.from_tuples(zip(A,B)))
   print(df)

但每次我都有一个错误 TypeError: unhashable type: 'numpy.ndarray' 我有一列时间:时间是hhmm格式的。01:00,01:01等等。我尝试从数据帧中删除列,但得到相同的错误。我怎样才能解决这个问题?有人能帮忙吗


Tags: 数据名称标题dfnp时间arraypd
1条回答
网友
1楼 · 发布于 2024-05-19 10:30:00

您可以在Pandas^{}命令中使用keys(使用正确的range和f-string创建相关的命名法,或者使用已经定义的list1):

keys sequence, default None

If multiple levels passed, should contain tuples. Construct hierarchical index using the passed keys as the outermost level.

import pandas as pd
import numpy as np

# setup
np.random.seed(12345)
all_df_list = []
for i in range(3):
    d = {
        'time': (pd.timedelta_range(start='00:01:00', periods=5, freq='1s')
                    + pd.Timestamp("00:00:00")).strftime("%M:%S"),
        'a': np.random.rand(5),
        'b': np.random.rand(5),
        'c': np.random.rand(5),
    }
    all_df_list.append(pd.DataFrame(d).round(2))

# code
dfc = pd.concat(all_df_list, axis=1,
        keys=[f'df{i}' for i in range(1,4)]) # use the correct 'range' or your already defined 'list1'

dfc = dfc.set_index(dfc.df1.time)
dfc = dfc.drop('time', axis=1, level=1)
print(dfc)
        df1               df2               df3
          a     b     c     a     b     c     a     b     c
time
01:00  0.93  0.60  0.75  0.66  0.64  0.73  0.03  0.53  0.82
01:01  0.32  0.96  0.96  0.81  0.72  0.99  0.80  0.60  0.50
01:02  0.18  0.65  0.01  0.87  0.47  0.68  0.90  0.05  0.81
01:03  0.20  0.75  0.11  0.96  0.33  0.79  0.02  0.90  0.10
01:04  0.57  0.65  0.30  0.72  0.44  0.17  0.49  0.73  0.22

df2中提取列ab

In [190]: dfc.df2[['a','b']]
Out[190]:
          a     b
time
01:00  0.66  0.64
01:01  0.81  0.72
01:02  0.87  0.47
01:03  0.96  0.33
01:04  0.72  0.44

相关问题 更多 >

    热门问题