Python:在相同的索引上连接两个具有相同列前缀的 DataFrame

Python: Join two DataFrames with same column prefix on same indices

我有两个如下所示的数据框:

df1 = pd.DataFrame(
{
    "A_price": [10, 12],
    "B_price": [20, 21],
},
index = ['01-01-2020', '01-02-2021']
)
df1:
            A_price B_price
01-01-2020  10      20
01-02-2021  12      21

df2 = pd.DataFrame(
{
    "A_weight": [0.1, 0.12],
    "B_weight": [0.2, 0.21],
},
index = ['01-01-2020', '01-02-2021']
)
df2:
            A_weight B_weight
01-01-2020  0.1      0.2
01-02-2021  0.12     0.21

如何将两个数据帧连接到相同的索引上,然后将列置于层次结构中?即我想要以下内容:

df:
            A              B
            price weight   price weight      
01-01-2020  10    0.1      20    0.2
01-02-2021  12    0.12     21    0.21

简单地用 pd.concat with axis=1, and split the columns by _ with .columns.str.split 水平连接(其中 expand=True、returns 和 MultiIndex):

new_df = pd.concat([df1, df2], axis=1)
new_df.columns = new_df.columns.str.split('_', expand=True)

输出:

>>> new_df
               A     B      A      B
           price price weight weight
01-01-2020    10    20   0.10   0.20
01-02-2021    12    21   0.12   0.21

这应该有效。

pd.concat((df1.T,df2.T), keys=["A", "B"]).T

您可以使用 pd.concatkeys 参数与 sort_index() 结合使用,使它们处于正确的结构中。然后rename多索引内层去除前缀的列:

df = pd.concat([df1, df2], keys=['A','B'],axis=1).sort_index(level=1, axis=1)
df.rename(columns=lambda x: x.split('_')[1], level=1)

               A      B     A      B
           price weight price weight
01-01-2020    10   0.10    20   0.20
01-02-2021    12   0.12    21   0.21

使用 join(或 merge)并展开您的列名。

# out = pd.merge(df1, df2, left_index=True, right_index=True)
out = out.join(df2)
out.columns = out.columns.str.split('_', expand=True)
out = out.sort_index(axis=1)
print(out)

# Output:
               A            B       
           price weight price weight
01-01-2020    10   0.10    20   0.20
01-02-2021    12   0.12    21   0.21