我有几个带有列(字母)的数据框,它们是我在不同时期的所有字母和时间索引的子集。对于每个时期,我都有几个带有不同字母信息(数字)的数据框。
import pandas as pd
df_1a = pd.DataFrame([[1, 2], [3, 4]], index=['2019-01-01', '2019-01-02'], columns=['A', 'C'])
df_1b = pd.DataFrame([[1, 2], [3, 4]], index=['2019-01-03', '2019-01-04'], columns=['A', 'B'])
df_2a = pd.DataFrame([[5, 0, 6], [7, 8, 8]], index=['2019-01-01', '2019-01-02'], columns=['A', 'B', 'C'])
df_2b = pd.DataFrame([[5, 6], [8, 8]], index=['2019-01-03', '2019-01-04'], columns=['B', 'C'])
我想在一个主数据帧df_master
中获得所有信息,该数据帧应具有以下结构:
columns = pd.MultiIndex.from_product([['A', 'B', 'C'],[1, 2]], names=['Letters', 'Numbers'])
df_master = pd.DataFrame(index=['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04'], columns=columns)
从以前的数据帧中获取最终数据帧的最佳方法是什么?
我已经成功地逐列进行了操作,但是我感觉必须有一种更有效的方法。
我对每个数据帧所做的操作(循环):
for letter in df_1a.columns.unique():
df_master.loc[df_1a.index, pd.IndexSlice[letter, 1]] = df_1a[letter]
答案 0 :(得分:1)
您的命名方案有些困难。但这是一个解决方案:
(pd.DataFrame({k:pd.concat(ds, sort=True).stack()
for k,ds in enumerate([(df_1a, df_1b), (df_2a, df_2b)],
start=1)})
.unstack()
.swaplevel(0,1, axis=1)
.sort_index(axis=1)
)
输出:
A B C
1 2 1 2 1 2
2019-01-01 1.0 5.0 NaN 0.0 2.0 6.0
2019-01-02 3.0 7.0 NaN 8.0 4.0 8.0
2019-01-03 1.0 NaN 2.0 5.0 NaN 6.0
2019-01-04 3.0 NaN 4.0 8.0 NaN 8.0