Pandas根据另一个数据框中的匹配列填充新的数据框列

时间:2016-10-02 11:47:04

标签: python pandas merge populate

我有一个df,其中包含我的主要数据,其中有一百万rows。我的主要数据还有30 columns。现在,我想在名为df的{​​{1}}中添加另一列。 categorycategory中的column,其中包含大约700个df2和另外两个rows,与columns中的columns匹配}}

我首先在dfindex中设置df2,这些df会在帧之间匹配,但index中的某些df2不会存在于df

df2中的其余列名为AUTHOR_NAMECATEGORY

df中的相关列称为AUTHOR_NAME

AUTHOR_NAME中的某些dfdf2中不存在,反之亦然。

我想要的说明是:当index中的dfindex中的df2匹配且title中的df与{title匹配时1}}在df2中,将category添加到df,否则在category中添加NaN。

示例数据:

df2
           AUTHOR_NAME              CATEGORY
Index       
Pub1        author1                 main
Pub2        author1                 main
Pub3        author1                 main
Pub1        author2                 sub
Pub3        author2                 sub
Pub2        author4                 sub


df
            AUTHOR_NAME     ...n amount of other columns        
Index       
Pub1        author1                 
Pub2        author1     
Pub1        author2 
Pub1        author3
Pub2        author4 

expected_result
            AUTHOR_NAME             CATEGORY   ...n amount of other columns
Index
Pub1        author1                 main
Pub2        author1                 main
Pub1        author2                 sub
Pub1        author3                 NaN
Pub2        author4                 sub

如果我使用df2.merge(df,left_index=True,right_index=True,how='left', on=['AUTHOR_NAME']),我的df变得比它应该的大三倍。

所以我认为合并可能是错误的方法。我真正想要做的是使用df2作为查找表,然后将type值返回df,具体取决于是否满足某些条件。

def calculate_category(df2, d):
    category_row = df2[(df2["Index"] == d["Index"]) & (df2["AUTHOR_NAME"] == d["AUTHOR_NAME"])]
    return str(category_row['CATEGORY'].iat[0])

df.apply(lambda d: calculate_category(df2, d), axis=1)

但是,这会引发一个错误:

IndexError: ('index out of bounds', u'occurred at index 7614')

5 个答案:

答案 0 :(得分:12)

考虑以下数据框MyWidgetdf

df2

选项1
df = pd.DataFrame(dict( AUTHOR_NAME=list('AAABBCCCCDEEFGG'), title= list('zyxwvutsrqponml') )) df2 = pd.DataFrame(dict( AUTHOR_NAME=list('AABCCEGG'), title =list('zwvtrpml'), CATEGORY =list('11223344') ))

merge

选项2
df.merge(df2, how='left')

join

这两个选项都会产生

enter image description here

答案 1 :(得分:1)

方法1:

您可以使用concat代替并删除IndexAUTHOR_NAME列中的重复值。之后,使用isin检查成员资格:

df_concat = pd.concat([df2, df]).reset_index().drop_duplicates(['Index', 'AUTHOR_NAME'])
df_concat.set_index('Index', inplace=True)
df_concat[df_concat.index.isin(df.index)]

Image

注意:假设列Index被设置为DF's的索引列。

方法2:

如图所示正确设置索引列后使用join

df2.set_index(['Index', 'AUTHOR_NAME'], inplace=True)
df.set_index(['Index', 'AUTHOR_NAME'], inplace=True)

df.join(df2).reset_index()

Image

答案 2 :(得分:0)

虽然这里的其他答案为问题提供了非常优雅和优雅的解决方案,但我找到了一个资源,它既以非常优雅的方式回答了这个问题,又提供了一个非常清晰明了的例子来说明如何完成数据帧的连接/合并,有效地教授LEFT,RIGHT,INNER和OUTER连接。

Join And Merge Pandas Dataframe

老实说,在这个话题之后,任何进一步的寻求者都会想要检查他的例子......

答案 3 :(得分:-1)

您可以尝试以下方法。它将合并指定列上的两个数据集作为键。

expected_result = pd.merge(df, df2, on = 'CATEGORY', how = 'left')

答案 4 :(得分:-1)

尝试

df = df.combine_first(df2)