【问题标题】:Merging multiple dataframe into one with each dataframe as a header name containing many columns in it and creating a 3D dataframe将多个数据框合并为一个,每个数据框作为标题名称,其中包含许多列并创建一个 3D 数据框
【发布时间】:2021-06-30 22:02:03
【问题描述】:

我有多个数据帧 df1、df2、df3 等到 df10。数据框有 135 列。每个看起来像这样:

time a b c d e f g
1 2 3 4 5 6 7 8

我想将它们排列在一个数据框中并将它们并排堆叠在一起,但将它们的 df 名称作为标题。意思是一个标题 df1 具有所有这些列名称(时间,a,b ...)及其下的值等等。在这里看到这个例子Constructing 3D Pandas DataFrame 我尝试了以下代码

   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 以此类推。我尝试从数据框中删除该列,但得到相同的错误。我该如何解决这个问题?有人可以帮忙吗?

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

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

    keys序列,默认无

    如果通过了多个级别,则应包含元组。以传递的键为最外层构造层次索引。

    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
    

    【讨论】:

    • 如何设置所有 df 中的所有“时间”列并将一个公共时间列设置为这个完整 df 的索引?另外,如何从特定数据框中子集特定列。可以说,我想提取列 a & b fir df2。我该怎么做?
    猜你喜欢
    • 2018-02-17
    • 2012-11-14
    • 1970-01-01
    • 2021-01-26
    • 2021-05-20
    • 2012-11-25
    • 2018-03-09
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多