2017-07-27 158 views
1

問題添加一個數據幀的列值到另一個:大熊貓,由iterrows

我有兩個dataframes(項目數量龐大):

df1 = 0 1 2 
     str str str 
     str str str 
     ... 


df2 = A B C D 
     str str str str 
     str str str str 
     ... 

我想要做的是比較,如果一列的字符串第二數據框的列:

for index, row in df1.iterrows(): 
    if df.iloc[index][0] in df2['A'].tolist(): #I'm converting to list because it seems like it can't look into the column as an object 

如果是這樣,我想這樣做是選擇同一行匹配的字符串中的df2['B']價值,並最終把它變成在df1,新的列在那裏我會碰到這樣的:

df1 = 0 1 2 B 
     str str str str 
     str str str nan 
     str str str nan 
     str str str str 

我覺得iterrows()是不是這樣做的最佳方法,但我不夠熟練找到一個更好的解決方案。

謝謝。

+0

你能詳細說明一個例子嗎,而不是僅僅使用「str」佔位符? – nanojohn

+0

提供樣品,例如** df1.head()。to_dict()**將有助於大量顯示問題。 –

回答

0

如果我正確理解你的問題,你應該能夠做到以下幾點。第一條語句計算一個臨時列'temp',如果它能夠在df2 ['A']中找到df1的值,則該列爲'True'。第二行查找在DF2 [「B」]判斷溫度是否真該值,否則返回np.NaN:

for col in df1.columns: 
    df1['temp'] = df1[col].isin(df2['A'].unique()) 
    df1[col] = df1[[col,'temp']].apply(lambda x: df2['B'].get_value(df2[df2['A'] == x[col]].index[0]]) if x['temp'] else np.NaN, axis=1) 
1

而且假設我理解正確你的問題:

可以使用。 ISIN()方法:

mask = df2['your_column'].isin(df1['your_other_column']) 
df1.loc[mask,'new_column'] = df2.loc[mask,'your_column'] 

請注意dataframes必須大小此方法的工作相同....

別的東西,我只是想的是使用字典和應用LY。我假設你在比較列中有獨特的值。

mask = df2['compare_column'].isin(df1['compare_column']) 
dictionary = dict(df2[['compare_column','new_column']][mask].values) 
df1['B'] = df1.apply(lambda x: dictionary[x['compare_column']], axis=1)