Python 用相同的列名但不同的后缀连接数据帧

Python 用相同的列名但不同的后缀连接数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我使用pandas merge根据一组条件将两个数据帧(每个24列)组合在一起,以生成一个包含具有相同值的行的数据帧;当然,每个数据帧中还有许多其他列具有不同的值。用于执行此操作的代码是: Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner' ) 结果是一个数据帧,它有48列,我现在想把它们放在一起(可能使用melt)。因此,要形象化这一点: D

我使用pandas merge根据一组条件将两个数据帧(每个24列)组合在一起,以生成一个包含具有相同值的行的数据帧;当然,每个数据帧中还有许多其他列具有不同的值。用于执行此操作的代码是:

   Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner' )
结果是一个数据帧,它有48列,我现在想把它们放在一起(可能使用melt)。因此,要形象化这一点:

           Deal_x        ID_x         Location_x  \... 21 other columns with _x postfix
0        130        5845             A   
1        155        5845             B  
2        138        6245             C   
3        152        7345             A 

         Deal_y        ID_y         Location_y \ ... 21 other columns  with _y postfix
0        155        9545             B   
1        155        0345             C   
2        155        0445             D   
我希望这成为:

           Deal        ID        Location \
0        130        5845             A   
1        155        5845             B  
2        138        6245             C   
3        152        7345             A 
0        155        9545             B   
1        155        0345             C   
2        155        0445             D  

请问我该怎么做

首先,使用
df.columns.str.split
去掉后缀,并从结果中的每个子列表中获取第一个拆分值

df_list = [df1, df2, ...]  # a generic solution for 2 or more frames

for i, df in enumerate(df_list):
    df_list[i].columns = df.columns.str.split('_').str[0]
现在,连接结果-

df = pd.concat(df_list, ignore_index=True)
df

   Deal    ID Location
0   130  5845        A
1   155  5845        B
2   138  6245        C
3   152  7345        A
4   155  9545        B
5   155   345        C
6   155   445        D
此外,如果您感兴趣,请使用
ID
上的
str.zfill
获得您的预期输出-

v = df.ID.astype(str)
v.str.zfill(v.str.len().max())

0    5845
1    5845
2    6245
3    7345
4    9545
5    0345
6    0445
Name: ID, dtype: object

返回结果。

您可以使用
后缀执行操作,将列拆分为
多索引,然后取消堆栈

Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner', suffixes=('_buy', '_sell')

Merged.columns = pd.MultiIndex.from_tuples(Merged.columns.str.rsplit('_').map(tuple), names=('key', 'transaction'))
如果要摆脱
多索引
,可以执行以下操作:

Merged.index = Merged.index.droplevel('transaction')

@尼莫先生如果有帮助,别忘了投票,接受答案。谢谢。这当然是我想要的答案,但我得到了一个奇怪的错误。:ValueError:平面形状没有对齐。。。。有什么想法吗?@nemo奇怪,
concat
非常适合那些不对齐的形状。请重新启动您的内核。这里似乎出现了错误:对于i,枚举中的df(df_列表):df_列表[i]。columns=df.columns.str.split(“”“).str[0]@MrNemo您能为我提供一个复制这个的文件吗?
    transaction Deal    ID  Location
0   buy 130 5845    A
0   sell    155 9545    B
1   buy 155 5845    B
1   sell    155 345 C
2   buy 138 6245    C
2   sell    155 445 D
Merged.index = Merged.index.droplevel('transaction')