2016-10-02 82 views
8

我有一个df其中包含我的主数据有一百万rows。我的主要数据也有30 columns。现在我想添加另一列到我的df,名为categorycategorydf2中的column,其包含约700 rows和另两个columns,其将与df中的两个columns匹配。熊猫根据另一个数据框中的匹配列填充新的数据帧列

我首先设定df2indexdf将在帧之间的匹配,但在df2一些index的不df存在。

df2中的其余列称为AUTHOR_NAMECATEGORY

df中的相关列被称为AUTHOR_NAME

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

我想要的指令是:当indexdfdf2比赛与indextitledfdf2title比赛,加categorydf,否则在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') 
+0

我不知道,如果'on'和'left_index/right_index'一起工作。也许你需要'on = ['Index','AUTHOR_NAME']'(或类似的东西)。我不确定哪个数据帧留在'df2.merge(df,...)'中。也许你需要'如何=“右'”或'pd.merge(左= df,右= df2,...)' – furas

回答

7

考虑以下dataframes dfdf2

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') 
    )) 

选项1
merge

df.merge(df2, how='left') 

选项2
join

cols = ['AUTHOR_NAME', 'title'] 
df.join(df2.set_index(cols), on=cols) 

这两个选项产生

enter image description here

+0

只是一个简短的说明..这对我工作很好..但在某些情况下,我结束了重复..仍然不知道是什么原因..但无论如何,删除重复只保留一个(保持=第一个OR保持=最后)..检查文档在这里https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html –

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索引列。


APPROACH 2:

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

Image

+0

这根本不适用于我,不知道为什么 – user3471881

+0

嗯,它适用于我虽然。你是否在'DFs'中使用了合适的名称,并且在两个框架中都设置了'Index'列作为索引?请仔细检查。让我用您设置的名称编辑帖子。 –

+0

是的,两个帧中的“索引”列都设置为索引,并且我使用了“DF”的相应名称。 – user3471881

相关问题