我有多个形状相同的数据帧,比如:

d1 = {'time': [1,2,3,4], 'A': [55.5,55.5,55.5,55.5], 'B':[55.5,55.5,55.5,55.5]}
d2 = {'time': [1,2,3,4], 'A': [7,6,5,4], 'B':[9,8,7,6]}
d3 = {'time': [1,2,3,4], 'A': [1,2,3,4], 'B':[2,3,4,5]}

df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)
df3 = pd.DataFrame(data = d3)

它们将始终具有相同的列名,"时间"列中的条目将始终相同.我想以某种方式合并它们,得到一个层次索引,即.

index  frame     'time'    'A'       'B'
0      1         1         55.5      55.5
       2         1         7         9
       3         1         1         2
1      1         2         55.5      55.5
       2         2         6         8
       3         2         2         3
...

我已经试过了.合并()和.join()和.concatenate()有各种选项,但我似乎无法理解它.实现这一目标最优雅的方式是什么?

推荐答案

IIUC,你可以对索引进行归纳和排序:

dfs = [df1, df2, df3]

(pd
 .concat(dict(enumerate(dfs, start=1)), names=['frame', 'index'])
 .sort_index(level='index')
 .swaplevel()
)

输出:

             time     A     B
index frame                  
0     1         1  55.5  55.5
      2         1   7.0   9.0
      3         1   1.0   2.0
1     1         2  55.5  55.5
      2         2   6.0   8.0
      3         2   2.0   3.0
2     1         3  55.5  55.5
      2         3   5.0   7.0
      3         3   3.0   4.0
3     1         4  55.5  55.5
      2         4   4.0   6.0
      3         4   4.0   5.0

Python相关问答推荐

比较两个数据帧并并排附加结果(获取性能警告)

如何将ctyles.POINTER(ctyles.c_float)转换为int?

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

Pandas 有条件轮班操作

如何在polars(pythonapi)中解构嵌套 struct ?

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

Pandas计数符合某些条件的特定列的数量

Pandas—在数据透视表中占总数的百分比

为什么\b在这个正则表达式中不解释为反斜杠

(Python/Pandas)基于列中非缺失值的子集DataFrame

如何将数据帧中的timedelta转换为datetime

如何在海上配对图中使某些标记周围的黑色边框

如何将返回引用的函数与pybind11绑定?

如何在Python中从html页面中提取html链接?

Polars定制函数返回多列

Django更新视图未更新

使用Scikit的ValueError-了解

将索引表转换为Numy数组

了解如何让库认识到我具有所需的依赖项

使用OpenPYXL切换图表上的行/列