【问题标题】:Pandas dataframe merge by function on column namesPandas 数据框按列名上的函数合并
【发布时间】:2018-11-29 04:36:41
【问题描述】:

我对数据框说。

df_A 具有列 A__a、B__b、C。(形状 5,3)

df_B 有 A_a、B_b、D 列。(形状 4,3)

如何统一它们(无需遍历所有列)以获得一个 df 与列 A,B ? (shape 9,2) - 意思是 A__a 和 A_a 应该统一到同一列。

我需要使用合并来应用函数lambda x: x.replace("_","")。有可能吗?

【问题讨论】:

    标签: python-3.x pandas dataframe merge concat


    【解决方案1】:
    import pandas as pd
    df = pd.DataFrame(np.random.randint(0,5,size=(5, 3)), columns=['A__a', 'B__b', 'C'])
    

    df:

       A__a  B__b  C
    0     3     0  2
    1     0     3  4
    2     0     4  4
    3     4     2  1
    4     3     4  3
    

    df2:

    df2 = pd.DataFrame(np.random.randint(0,4,size=(4, 3)), columns=['A__a', 'B__b', 'D'])
    
       A__a  B__b  D
    0     3     2  0
    1     3     1  1
    2     0     2  0
    3     3     2  0
    
    df3 = pd.concat([df, df2], join='inner', ignore_index=True)
    df_final = df3.rename(lambda x: str(x).split("__")[0],axis='columns')
    df_final
    

    df_final:

        A   B
    0   3   0
    1   0   3
    2   0   4
    3   4   2
    4   3   4
    5   3   2
    6   3   1
    7   0   2
    8   3   2
    

    【讨论】:

      【解决方案2】:

      一个简单的连接就可以了

      pd.concat([df_A, df_B], join='outer')[['A', 'B']].copy().

      或 'pd.concat([df_A, df_B], join='inner')

      【讨论】:

        【解决方案3】:

        您必须使用“外部”合并数据框

        import pandas as pd
        import numpy as np
        
        
        df_A = pd.DataFrame(np.random.randint(10,size=(5,3)), columns=['A','B','C'])
        df_B = pd.DataFrame(np.random.randint(10,size=(4,3)), columns=['A','B','D'])
        
        print(df_A.shape,df_B.shape)
        #(5, 3) (4, 3)
        new_df = df_A.merge(df_B , how= 'outer', on = ['A','B'])[['A','B']]
        print(new_df.shape)
        #(9,2)
        

        【讨论】:

          【解决方案4】:

          如果不能提前更改列名,又想使用lambda x: x.replace("_",""),这是一个办法:

          df = pd.concat([df1.rename_axis(lambda x: str(x).replace("_",""),axis='columns'), df2.rename_axis(lambda x: str(x).replace("_",""),axis='columns')], join='inner', ignore_index=True)
          

          例子:

          d1 = {'A__a' : ('A', 'B', 'C', 'D', 'E') ,  'B__b' : ('a', 'b', 'c', 'd', 'e') ,'C': (1,2,3,4,5)}
          df1 = pd.DataFrame(d1)
            A__a B__b  C
          0    A    a  1
          1    B    b  2
          2    C    c  3
          3    D    d  4
          4    E    e  5
          
          d2 = {'A_a' : ('B', 'C', 'D','G') , 'B_b' : ('l','m','n','o') ,'D': (6,7,8,9)}
          df2=pd.DataFrame(d2)
            A_a B_b   D
          0   B   l   6
          1   C   m   7
          2   D   n   8
          3   G   o   9
          

          输出:

             Aa Bb
          0  A  a
          1  B  b
          2  C  c
          3  D  d
          4  E  e
          5  B  l
          6  C  m
          7  D  n
          8  G  o
          

          替代方案:

          df = pd.concat([df1.rename(columns={'A__a':'A', 'B__b':'B'}), df2.rename(columns={'A_a':'A', 'B_b':'B'})], join='inner', ignore_index=True)
          

          【讨论】:

            猜你喜欢
            • 2020-06-17
            • 2018-09-28
            • 2021-06-21
            • 2019-07-23
            • 2019-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多