【问题标题】:Pandas - Mapping dict with multiple index to columnPandas - 将具有多个索引的字典映射到列
【发布时间】:2019-10-18 09:01:40
【问题描述】:

我有两个大型数据集,我无法通过组合两个数据框来进行聚合。我必须先对df_train 进行聚合,然后将值映射到df_test。

df_train 和 df_test 具有完全相同的 id1 和 id2,但 df_test 有更多样本。我正在计算 id1 和 id2 上的目标均值,并将其存储为字典以解决内存问题。

target_mean = df_train.groupby(['id1', 'id2'])['target'].mean().to_dict()

这是聚合的输出。键是元组对,id1 作为第一个元素,id2 作为第二个元素,值是组的目标均值。

{(0, 0): 146.45497131347656,
 (1, 0): 74.86539459228516,
 (2, 0): 14.551384925842285,
 (3, 0): 235.5499725341797,
 (4, 0): 976.5567626953125,
 (5, 0): 17.894445419311523,
 (6, 0): 64.06660461425781,
 (7, 0): 350.33416748046875,
 (7, 1): 3097.043701171875,
 (8, 0): 256.92779541015625,
 (9, 0): 72.7147445678711 }

如何将这些值正确映射到 id1 和 id2 列?

(有 6000 万 行数据,1449 id1 和 4 id2 值,所以速度很重要)

编辑:

df_train[['id1', 'id2']].map(target_mean)

我试过这个,但map 只支持pd.Series。

【问题讨论】:

    标签: python pandas numpy data-science


    【解决方案1】:

    我认为最好在这里使用DataFrame.join:

    target_mean = df_train.groupby(['id1', 'id2'])['target'].mean().rename('avg')
    
    df_test = df_test.join(target_mean, on=['id1', 'id2'])
    

    您的解决方案是可能的,但我猜map by MultiIndex 会更慢:

    target_mean = df_train.groupby(['id1', 'id2'])['target'].mean().to_dict()
    df_test['avg'] = df_test.set_index(['id1', 'id2']).index.map(target_mean)
    

    【讨论】:

    • 谢谢,join 就像魔术一样工作。在这种情况下,merge 和 join 有什么区别?我应该将how='left' 添加到join 吗?
    • @gunesevitan - how='left' 不是必需的,因为join 中的默认参数。 merge和join的区别主要是join默认使用索引进行合并,merge默认使用on参数指定的列名
    猜你喜欢
    • 2021-11-25
    • 2018-02-20
    • 2016-09-02
    • 2012-09-17
    • 2019-08-23
    • 2021-08-31
    • 2014-12-14
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多