【问题标题】:Concatenate dataframes with the same column names but different suffixes连接具有相同列名但不同后缀的数据框
【发布时间】:2018-06-20 12:57:58
【问题描述】:

我使用 pandas 合并将两个数据帧(每个 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  

请问我该怎么做?

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

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

    将结果分配回去。

    【讨论】:

    • @MrNemo 如果有帮助,别忘了投票并接受答案。谢谢。
    • 这当然是我想要的答案,但出现了一个奇怪的错误。:ValueError:计划形状未对齐......有什么想法吗?
    • @MrNemo Strange,concat 非常适合那些未对齐的形状。请重启你的内核。
    • 错误似乎发生在这里:for i, df in enumerate(df_list): df_list[i].columns = df.columns.str.split('_').str[0]
    • @MrNemo 你能提供一个minimal reproducible example 来复制这个吗?
    【解决方案2】:

    您可以对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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多