映射两个数据框以创建一个包含多个键值的字典 - Pandas

Posted

技术标签:

【中文标题】映射两个数据框以创建一个包含多个键值的字典 - Pandas【英文标题】:Map Two Data Frames to create a dictionary with multiple values for a key - Pandas 【发布时间】:2018-03-19 07:20:13 【问题描述】:

我想创建一个dictionary,它有多个键值。

我有以下 DataFrame df1 像这样:

    ID       SUM       COUNT
2   3002    256401.0    15
1   3021    5412.49     21
4   3022    45454.12    12
3   3025    15487.23    45
5   3026    154876.1    88

我想将 ID 映射到大查找表,以便为每个 ID 获取多个值。我的另一个查找表df2 是这样的,

    ID      Var1    Var2    Var3    Var4
0   3021    Cfd45   shkjs   shkjs   465
1   3021    sfs     None    fjslk   323
2   3021    hjfks   shka    fsad    457
3   3022    None    skank   vssf    236
4   3022    sdkj    vbjajl  bbf     124
5   3025    klgf    vcbj    jgjg    895
6   3026    tuo     None    gdsfs   457
7   3026    klo     ahk     None    569
8   3026    nbjd    alkdjl  sfsfs   124

现在,我想按 ID 映射这两个 DataFrame,并创建一个字典,该字典具有唯一 ID 和来自 df2var1var2var3 列的多个值,

3021: ['Cfd45', 'shkjs', 'sfs', 'jkdg', 'fjslk', 'hjfks', 'shka', 'fsad'],
3022: ['skank', 'vssf', 'sdkj', vbjajl', 'bbf'],
3025: ...

值可以在列表或元组中。

对于我的场景,我能找到的最接近的是post。但是,当我映射到表时,我想要来自多个列的值。我该怎么做?任何想法,将不胜感激。

【问题讨论】:

【参考方案1】:

让我们在 df2 上试试这个:

df2.set_index('ID')[['Var1','Var2','Var3']].stack().groupby(level=0).apply(lambda x: x.unique()).to_dict()

输出:

    3021: array(['Cfd45', 'shkjs', 'sfs', 'None', 'fjslk', 'hjfks', 'shka', 'fsad'], dtype=object),
 3022: array(['None', 'skank', 'vssf', 'sdkj', 'vbjajl', 'bbf'], dtype=object),
 3025: array(['klgf', 'vcbj', 'jgjg'], dtype=object),
 3026: array(['tuo', 'None', 'gdsfs', 'klo', 'ahk', 'nbjd', 'alkdjl', 'sfsfs'], dtype=object)

df2.set_index('ID')[['Var1','Var2','Var3']].stack().groupby(level=0).apply(lambda x: x.unique()).to_json()

输出:

'"3021":["Cfd45","shkjs","sfs","None","fjslk","hjfks","shka","fsad"],"3022":["None","skank","vssf","sdkj","vbjajl","bbf"],"3025":["klgf","vcbj","jgjg"],"3026":["tuo","None","gdsfs","klo","ahk","nbjd","alkdjl","sfsfs"]'

【讨论】:

谢谢!这是一个很好的方法。但是,我只需要我只需要var1var2var3。另外,我认为当我有很多记录时,这种方法会花费很多时间。 @i.n.n.m 好的,添加了对 Var1、Var2、Var3 的限制 不错,其他一些列的记录超过一百万条,花了很长时间。现在我仅限于列,它可以工作。我正在尝试这个,在这里,***.com/questions/44713968/…。我猜,区别是在你的代码中使用stack() 来添加多列? 是的,我正在使用 stack() 将所有 thos Var 对齐到单个列中,使用与该 SO 帖子中描述的相同技术,除了我得到唯一值。

以上是关于映射两个数据框以创建一个包含多个键值的字典 - Pandas的主要内容,如果未能解决你的问题,请参考以下文章

Python字典_术语

Python将列表转换为具有多个键值的字典[关闭]

Python之字典中的键映射多个值

Python(10)--字典--深浅复制

如何比较每个字典中 JSON Array 键值的字符串以查看它们是不是包含 NSUserDefault 字符串并返回 JSON 字典匹配项

Python - 从包含值列表的字典中添加具有映射值的新列