2017-06-24 9 views
1

を持っている場合、私は2つのデータフレームがあると、二番目の第1データフレームの列を割り当てる:データフレームは異なるサイズを

df1 = pd.DataFrame(np.arange(0,301),columns = ['id']) 
df2 = pd.DataFrame(np.arange(200,387),columns = ['id']) 

df1['2'] = np.random.randint(0,2,301) 
df2['2'] = np.random.randint(0,2,187) 

そしてIは第一と第二のデータフレームからIDを一致させ、第三のDFを作成する:

temp = df2.loc[df2['id'].isin(df1['id'])] 

それから私はいくつかの値を計算します。

def values_14(row): 
    if row['2'] == 1: 
     return 1 
    else: 
     return 0 


temp['val'] = temp.apply(lambda row: values_14(row),axis = 1) 

私の質問は:私はから値を割り当てることができますか最初のデータフレームのデータフレームtempの列val(最初のデータフレームのididtempに一致しない場合は、NAを割り当てます)一般?一般的には、たとえば、id列が名前であり、数値のようにソートされていない状況を意味します。パンダでどうすればいいですか?

答えて

1

最初にdf1に列を割り当て、デフォルトでNAとします。次に、各行のdf1にの値を取得し、同じidtempdataframeにあるかどうかを調べます。空でないものを返す場合は、対応する行df1を、最初にtempから返された値で代入します。あなたは、次の試みることができます(NPはnumpyのを参照)

# setting empty nan column for 'val' in df1 
df1['val'] = np.nan 

# iterate through each row in df1 
for index, row in df1.iterrows(): 
    # look for corresponding rows in temp dataframe 
    # that matches id of current row of df1 
    val_df = temp.loc[temp['id'] == row['id']] 
    # if id matched in temp then it will return non-empty 
    if not val_df.empty: 
     # assign corresponding row of df1 with first value 
     # of temp which where id matched 
     df1.loc[index, 'val'] = val_df['val'].values[0] 
+0

私はカップルの質問をしてみましょう: 1)val_df = temp.loc [TEMP [ 'ID'] ==行[ 'ID' ]]この行は([True] False)行['id']とtemp ['id']のすべての値を同時に比較しますか? 2)df1.loc [index、 'val'] = val_df ['val']。values [0] RHSから値[0]をコード化する必要がある理由をここで説明してください。 –

+0

@Mat_nekras '1)' yesの場合、比較後に 'TrueまたはFalse'を返します。 '.values'は' ndarray'と '.values [0]'に変更し、配列から最初の要素を選びます。他の選択肢や効率的な方法もあります。 – 0p3n5ourcE

+0

ちょうど1つの問題が表示されます。id値がスティングの場合、コードは機能しません。インデックスは整数でもスライスでも文字列ではないはずです –

関連する問題