代码之家  ›  专栏  ›  技术社区  ›  avibrun

使用循环(python)合并两个不同的数据帧[重复]

  •  1
  • avibrun  · 技术社区  · 6 年前

    我是python新手,遇到了以下问题。

    我有两个数据帧,其中第一个看起来像这样:

    df1
    code  product
    10-00  apple
    10-10  banana
    10-20  grape
    10-00  cucumber
    20-00  tomato
    20-10  onion
    20-10  garlic
    

    第二个看起来像:

    df2
    code  colour
    10-00  green
    10-10  yellow
    10-20  purple
    20-00  red
    20-10  white
    

    我希望有一个循环,可以给出以下数据帧

    df
    10-00  apple  green
    10-10  banana  yellow
    10-20  grape  purple
    10-00  cucumber  green
    20-00  tomato  red
    20-10  onion  white
    20-10  garlic  white
    

    但我真的不知道从哪里开始。。 有没有人有过这样的经历?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Anton vBR    6 年前

    试试这个( pd.DataFrame.merge )

    df = pd.merge(df1,df2,on=['code'],how='left')
    

    例子:

    import pandas as pd
    
    df1 = pd.DataFrame({
        'code': ['10-00','10-10'],
        'product': ['apple','banana']
    })
    
    df2 = pd.DataFrame({
        'code': ['10-00','10-10'],
        'colour': ['green','yellow']
    })
    
    df = pd.merge(df1,df2,on=['code'],how='left')
    
    print(df)
    

    返回值:

        code product  colour
    0  10-00   apple   green
    1  10-10  banana  yellow
    
        2
  •  0
  •   juanpa.arrivillaga    6 年前

    不要使用循环,索引 df2 数据帧由 code 列,使用简单赋值!

    >>> df1.set_index('code', inplace=True)
    >>> df2.set_index('code',inplace=True)
    >>> df1
            product
    code
    10-00     apple
    10-10    banana
    10-20     grape
    10-00  cucumber
    20-00    tomato
    20-10     onion
    20-10    garlic
    >>> df2
           colour
    code
    10-00   green
    10-10  yellow
    10-20  purple
    20-00     red
    20-10   white
    

    然后简单地:

    >>> df1['colour'] = df2['colour']
    >>> df1
            product  colour
    code
    10-00     apple   green
    10-10    banana  yellow
    10-20     grape  purple
    10-00  cucumber   green
    20-00    tomato     red
    20-10     onion   white
    20-10    garlic   white
    

    如果你不想索引 df1 对于代码(它会给您一个重复的索引),您可以始终使用:

    >>> df1['colour'] = df2.loc[df1['code']].values
    >>> df1
        code   product  colour
    0  10-00     apple   green
    1  10-10    banana  yellow
    2  10-20     grape  purple
    3  10-00  cucumber   green
    4  20-00    tomato     red
    5  20-10     onion   white
    6  20-10    garlic   white
    

    只要 df2型 索引依据 'code'

        3
  •  0
  •   jpp    6 年前

    这是可能的 set_index join :

    df1.set_index('code').join(df2.set_index('code')).reset_index()
    

    后果

        code   product  colour
    0  10-00     apple   green
    1  10-00  cucumber   green
    2  10-10    banana  yellow
    3  10-20     grape  purple
    4  20-00    tomato     red
    5  20-10     onion   white
    6  20-10    garlic   white
    

    解释

    • set_index('code') 应用于两者 df1 df2 这样我们以后可以使用它来加入。
    • 参加 默认情况下,作为索引上的“左联接”应用。
    • reset_index 应用于结果,以便检索具有所需列的数据帧。