2016-12-04 9 views
0

最初のデータフレームのいくつかの条件に基づいて、別のデータフレームの異なるカラムから値を選択してデータフレームに新しいカラムを作成する方法はありますか?私はラムダ関数を適用使って試してみましたが、それは私に条件付きで他のデータフレームのデータに基づいてカラム値を選択します

KeyError: ('Country', u'occurred at index Country') 
を与える

df = pd.DataFrame(
    [['USA', 1992, 20] 
    ['China', 1993, 15] 
    ['Japan', 1994, 40]], 
    columns = ['Country', 'year', 'score']) 

私のデータセットは、このようなものです:

df1 = pd.DataFrame(
    [['USA', 1992], 
    ['China', 1993], 
    ['Japan', 1994]], 
    columns = ['Country', 'year']) 
scores = pd.DataFrame(
    [['USA', 20, 30, 40], 
    ['China', 5, 15, 30], 
    ['Japan', 30, 50, 40], 
    ['Korea', 10, 15, 20], 
    ['France', 10, 12, 15]], 
    columns = ['Country', 1992, 1993, 1994]) 

そして、私の希望のデータセットは以下のようになります

私が試したラインは:

df1['score'] = df.apply(lambda x: scores[scores['Country'] == x['Country']][x['year']][1]) 

ありがとうございます!

+0

条件は何ですか。どのようにそれらを選択したいですか?あなたのコードが機能していないので、あなたのコードからそれを理解することはできません。 – ayhan

+0

@ayhan前回の編集ではスコアデータフレームが欠けていたと思うので、混乱の原因となります。私はdf1の年の列に基づいてdf1に新しいスコア列を追加しようとしていました。ありがとう –

+0

ああ、ごめんなさい。 – ayhan

答えて

1

あなたはscoresデータフレームを溶かし、元にマージすることができます:デフォルトで

scores = pd.melt(scores, id_vars='Country', value_name='score', var_name='year') 
df1.merge(scores) 
Out: 
    Country year score 
0  USA 1992  20 
1 China 1993  15 
2 Japan 1994  40 

mergeは、共通の列にマージします。あなたが列名を指定したい場合は、あなたがscoresデータフレームにインデックスとしてCountryを使用することができます

+0

前に溶融機能を知らなかった、ありがとう! –

0

onパラメータ(すなわちdf1.merge(scores, on=['Country', 'year']))を使用することができます。

scores = scores.set_index(['Country']) 

は、その後、あなたは関数を適用することができるようになりますあなたにこの出力を与える

def get_score(row): 
    row['score'] = scores.loc[row['Country'], row['year']] 
    return row 

df = df1.apply(get_score, axis=1) 

:作成し、所望の値とscore列を充填get_score

Country year score 
0  USA 1992  20 
1 China 1993  15 
2 Japan 1994  40 
関連する問題