首页 > 解决方案 > 使用多个数据框创建嵌套数据框

问题描述

我有多个数据框,以下只是其中的 2 个:

print(df1)

Date                 A  B  C  
2019-10-01 00:00:00  2  3  1  
2019-10-01 01:00:00  5  1  6  
2019-10-01 02:00:00  8  2  4  
2019-10-01 03:00:00  3  6  5  



print(df2)

Date                 A  B  C  
2019-10-01 00:00:00  9  4  2  
2019-10-01 01:00:00  3  2  4  
2019-10-01 02:00:00  6  5  2  
2019-10-01 03:00:00  3  6  5  

它们都具有相同的索引和列。我想创建这样的数据框:

    Date                df1  df2
A   2019-10-01 00:00:00   2    9 
    2019-10-01 01:00:00   5    3  
    2019-10-01 02:00:00   8    6
    2019-10-01 03:00:00   3    3  
B   2019-10-01 00:00:00   3    4  
    2019-10-01 01:00:00   1    2  
    2019-10-01 02:00:00   2    5  
    2019-10-01 03:00:00   6    6  
C   2019-10-01 00:00:00   1    2  
    2019-10-01 01:00:00   6    4  
    2019-10-01 02:00:00   4    2  
    2019-10-01 03:00:00   5    5

我必须将此过程应用于 30 个数据帧(它们的索引和列相同),所以我想编写一个 for 循环来实现这个数据帧。我怎样才能做到这一点?

标签: pandasdataframenested

解决方案


用and then重塑DataFrames列表的每个 DataFrame ,最后用 lambda 函数更改列名:DataFrame.set_indexDataFrame.unstackconcat

dfs = [df1,df2]
df = (pd.concat([x.set_index('Date').unstack() for x in dfs], axis=1)
       .rename(columns=lambda x: f'df{x+1}'))
print (df)
                       df1  df2
  Date                         
A 2019-10-01 00:00:00    2    9
  2019-10-01 01:00:00    5    3
  2019-10-01 02:00:00    8    6
  2019-10-01 03:00:00    3    3
B 2019-10-01 00:00:00    3    4
  2019-10-01 01:00:00    1    2
  2019-10-01 02:00:00    2    5
  2019-10-01 03:00:00    6    6
C 2019-10-01 00:00:00    1    2
  2019-10-01 01:00:00    6    4
  2019-10-01 02:00:00    4    2
  2019-10-01 03:00:00    5    5

如果希望最终创建列表中的一些自定义列名称DataFrame具有相同大小,例如长度dfs并添加参数keys

dfs = [df1,df2]
names = ['col1','col2']

df = pd.concat([x.set_index('Date').unstack() for x in dfs], keys=names, axis=1)
print (df)
                       col1  col2
  Date                           
A 2019-10-01 00:00:00     2     9
  2019-10-01 01:00:00     5     3
  2019-10-01 02:00:00     8     6
  2019-10-01 03:00:00     3     3
B 2019-10-01 00:00:00     3     4
  2019-10-01 01:00:00     1     2
  2019-10-01 02:00:00     2     5
  2019-10-01 03:00:00     6     6
C 2019-10-01 00:00:00     1     2
  2019-10-01 01:00:00     6     4
  2019-10-01 02:00:00     4     2
  2019-10-01 03:00:00     5     5

推荐阅读