2017-11-28 10 views
2

覚え書き/想起ゲームを想像してみましょう。チョコレートと他のものでいっぱいのテーブルがある部屋があります。あなたは各テーブルを見るのに20秒ある。後で、あなたが見たことが尋ねられます。これにより、2つのデータセットが得られます。 1つはテーブルの構成で、もう1つは覚えておくことができます。タスクは、あなたが正しく想起したアイテムと覚えていないアイテムを評価することです。この作業では、製品のブランドについては気にしません。ちょうどタイプ。パンダ:互いに2つのデータフレームを評価する

enter image description here

ここでは、2つの部屋の設定例です。

config = [ 
     {'room': 'room1', 'kind': 'chocolate', 'brand': 'Mars'}, 
     {'room': 'room1', 'kind': 'chocolate', 'brand': 'Mars'}, 
     {'room': 'room1', 'kind': 'chocolate', 'brand': 'Milka'}, 
     {'room': 'room1', 'kind': 'nuts', 'brand': 'Bahlsen'}, 
     {'room': 'room2', 'kind': 'chocolate', 'brand': 'Mars'}, 
     {'room': 'room2', 'kind': 'nuts', 'brand': 'Ültje'}, 
     {'room': 'room2', 'kind': 'nuts', 'brand': 'Bahlsen'} 
     ] 

import pandas as pd 
df_config = pd.DataFrame(config).sort_values(['room']) 
df_config 

ここで時間を覚えているのは20秒です。その後、あなたはあなたが見たことを尋ねられます。あなたが覚えているものは次のとおりです。

recall = [ 
     {'room': 'room1', 'kind': 'chocolate'}, 
     {'room': 'room1', 'kind': 'chocolate'}, 
     {'room': 'room1', 'kind': 'nuts'}, 
     {'room': 'room2', 'kind': 'nuts'} 
     ] 

import pandas as pd 
df_recall = pd.DataFrame(recall).sort_values(['room']) 
df_recall 

明らかに、部屋1に2つのチョコレートバーがあるので、3つ目を逃しました。部屋2のために、ナッツの第2袋を逃した。そのため、評価結果は、多少のようになります:

correct = [ 
     {'room': 'room1', 'kind': 'chocolate', 'brand': 'Mars', 'eval': 'correct'}, # first chocolate room1 
     {'room': 'room1', 'kind': 'chocolate', 'brand': 'Mars', 'eval': 'correct'}, # second chocolate room1 
     {'room': 'room1', 'kind': 'nuts', 'brand': 'Bahlsen', 'eval': 'correct'}, # first nuts room1 
     {'room': 'room2', 'kind': 'nuts', 'brand': 'Ültje', 'eval': 'correct'}, # first nuts room2 
     ] 

incorrect = [ 
     {'room': 'room1', 'kind': 'chocolate', 'brand': 'Milka', 'eval': 'incorrect'}, # third chocolate room1 not recalled 
     {'room': 'room2', 'kind': 'chocolate', 'brand': 'Mars', 'eval': 'incorrect'}, # first chocolate room2 not recalled 
     {'room': 'room2', 'kind': 'nuts', 'brand': 'Bahlsen', 'eval': 'incorrect'} # second nuts room2 not recalled 
     ] 

私は部屋に基づいて、両方のデータセットをマージし、次いで室温でグループと、各グループを評価するために考えていました。 グループを反復するか、df.groupy(['room'])を使用します。apply(my_function)。問題は、マージが各部屋に非常に大きなグループを作成し、私はこれをどのように評価するのか分からないということです。

df = pd.merge(df_config, df_recall, on='room', suffixes=('', '_recall')) 

私はあなたがcumcountによってroomskindごとに一意の値のためのヘルパーの列が必要だと思う

おかげ

答えて

2

。次に、パラメータonに列を追加し、左結合を指定します。

df_config['g'] = df_config.groupby(['room','kind']).cumcount() 
df_recall['g'] = df_recall.groupby(['room','kind']).cumcount() 

df = pd.merge(df_config, df_recall, on=['room', 'g'], suffixes=('', '_recall'), how='left') 
print (df) 
    brand  kind room g kind_recall 
0  Mars chocolate room1 0 chocolate 
1  Mars chocolate room1 0  nuts 
2  Mars chocolate room1 1 chocolate 
3 Milka chocolate room1 2   NaN 
4 Bahlsen  nuts room1 0 chocolate 
5 Bahlsen  nuts room1 0  nuts 
6  Mars chocolate room2 0  nuts 
7 Ültje  nuts room2 0  nuts 
8 Bahlsen  nuts room2 1   NaN 
+0

最後にkind対kind_recallを評価しますか?あなたの解決策の問題は、room1の場合、人が正しく覚えているにもかかわらず、Bah_ssナットがkind_recall列のNaNであるということです。 – Matthias

+0

'df_config.groupby(['room'、 'type'])。cumcount()'はどうですか? – jezrael

+0

うん、それはうまくいった。非常にエレガントなソリューション。ありがとう。 – Matthias

関連する問題