2017-07-27 6 views
1

によって別の問題を1つのデータフレームの列の値を追加:パンダ、iterrows

私は2つのデータフレーム(アイテムのMASSIVE数)があります。私は何をしたいか

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


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

する場合と比較することです第二データフレームの列に1列の文字列:

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の新しい列、:私はiterrows()ように感じる

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

は、そうするための最良の方法ではありませんが、私はよりよい解決策を見つけるために熟練十分ではありませんよ。

ありがとうございます。

+0

「str」プレースホルダを使用するのではなく、例を使ってもう少し詳しく説明できますか? – nanojohn

+0

サンプルを提供する。 ** df1.head()。to_dict()**は、問題を視覚化するのに多く役立ちます。 –

答えて

0

私があなたの質問を正しく理解していれば、次のことができるはずです。最初のステートメントは、df2 ['A']内のdf1の値を見つけることができる場合にTrueの一時的な列 'temp'を計算します。

を使用することができます:

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

はまた、私が正しくあなたの質問を理解して仮定:TEMPがTrueの場合は2行目には、それ以外の場合はnp.NaNを返し、DF2 [「B」]でこの値を検索します。 ISIN()メソッド:

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

私はちょうど考え、他の

何かが辞書やアプリを使用している....データフレームは、この方法が機能するには、同じサイズでなければならないことに注意してくださいまあ。私はあなたが比較列に一意の値を持っていると仮定しています。

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)