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.concat
将 keys
参数与 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
我有两个如下所示的数据框:
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.concat
将 keys
参数与 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