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

时间:2018-01-11 08:50:08

标签: python pandas dataframe merge

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

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

结果是一个有48列的数据框,我现在想把它们汇总在一起(可能使用熔化)。所以想象一下:

           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  

请问我该怎么做?

2 个答案:

答案 0 :(得分:2)

首先,使用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

此外,如果您有兴趣,请使用str.zfill上的ID来获得预期的输出 -

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

重新分配结果。

答案 1 :(得分:1)

您可以对suffixes执行某些操作,将列拆分为MultiIndex,然后取消堆叠

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 = Merged.stack(level='transaction')
    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

如果你想摆脱MultiIndex你可以做的事情:

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