2016-10-02 127 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

相關問題