【问题标题】:Easiest way to generate dataframe out of dict and list从 dict 和 list 生成数据框的最简单方法
【发布时间】:2020-07-27 12:26:21
【问题描述】:

我有一个字典和一个列表:

d1 = {"k1": [1,2,3], "k2": [4,5,6], "k3": [3,2,1]}
l1 = ["label1", "label2", "label1"]

我想将它组合到一个数据帧中。 l1中的每个元素对应d1中的一个键

期望的输出(熊猫数据框):

  key  value   label
0  k1   1     label1
1  k1   2     label1
2  k1   3     label1
3  k2   4     label2
4  k2   5     label2
5  k2   6     label2
6  k3   3     label1
7  k3   2     label1
8  k3   1     label1

到达那里最简单和最 Pythonic 的方式是什么?

【问题讨论】:

    标签: python pandas list dataframe dictionary


    【解决方案1】:

    我们可以使用DataFrame.meltSeries.map 来实现这一点,同时巧妙地使用zipping 列表和字典键:

    from collections import OrderedDict
    
    df = pd.DataFrame(d1).melt(var_name='key')
    df['label'] = df['key'].map(OrderedDict(zip(d1.keys(), l1)))
    
      key  value   label
    0  k1      1  label1
    1  k1      2  label1
    2  k1      3  label1
    3  k2      4  label2
    4  k2      5  label2
    5  k2      6  label2
    6  k3      3  label1
    7  k3      2  label1
    8  k3      1  label1
    

    【讨论】:

    • 请注意,也给 OP,d1.keys() 的顺序不能保证被排序。所以zip(d1.keys(), l1) 可能会给出不同的结果。
    • 这对Series.map @QuangHoang 有影响吗?
    • 不是map,而是dict(zip(...))。所以你可能有k1:label2
    • 是的,添加了OrderedDict 的修复,这应该可以解决,同意吗? @QuangHoang
    • 当然OrderedDict 会解决这个问题。但这更多是 OP 的数据结构问题。你将OrderedDict 包裹在zip(d1.keys(), l1) 周围并不能解决d1.keys() 的随机性。
    猜你喜欢
    • 2021-03-21
    • 2014-09-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多