让我们想象一下记忆/召回游戏。有些桌子上摆满了巧克力和其他东西。你有20秒的时间来查看每个表。稍后你会被问到你所看到的。这给出了两个数据集。一个是表的配置,另一个是你能记住的。任务是评估您正确召回的项目以及您不记得的项目。在这项任务中,我们不关心产品的品牌。只是类型。
这是两个房间的示例配置。
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号房间,你错过了第二袋坚果。所以,评估结果有点像这样:
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'))
欢迎任何想法!
由于
答案 0 :(得分:2)
我认为每rooms
和kind
cumcount
需要帮助列来获取唯一值。然后将列添加到参数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