熊猫:相互评估两个数据帧

时间:2017-11-28 09:55:38

标签: python pandas join dataframe merge

让我们想象一下记忆/召回游戏。有些桌子上摆满了巧克力和其他东西。你有20秒的时间来查看每个表。稍后你会被问到你所看到的。这给出了两个数据集。一个是表的配置,另一个是你能记住的。任务是评估您正确召回的项目以及您不记得的项目。在这项任务中,我们不关心产品的品牌。只是类型。

enter image description here

这是两个房间的示例配置。

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'))

欢迎任何想法!

由于

1 个答案:

答案 0 :(得分:2)

我认为每roomskind 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