【问题标题】:Is there a method for creating dataframe of dummy variables from a dictionary of lists?有没有一种方法可以从列表字典中创建虚拟变量的数据框?
【发布时间】:2018-04-22 22:03:48
【问题描述】:

在 pandas 中,我有一本字典,如下所示:

{'Anemones & allies': ['Carnivore'],
'Ants, bees & wasps': ['Omnivore',  'Herbivore',  'Nectar',  'Insects', 'Parasite'],
'Beetles & bugs': ['Herbivore', 'Carnivore', 'Nectar', 'Insects'],
'Birds': ['Carnivore'],
'Fishes': ['Carnivore', 'Plankton or Particles']}

我想将它转换成一个 DataFrame,你可以在其中看到动物类型可能吃什么。所以它看起来类似于下图:

在尝试生成这样的表格时,我感觉我的做法不正确,因为我需要相当多的代码行。所以我的问题是,是否有一个很好的函数可以将此字典映射到 DataFrame,使其看起来像上表?

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    最简单的方法
    使用pd.str.get_dummies

    dct = {
        'Anemones & allies': ['Carnivore'],
        'Ants, bees & wasps': ['Omnivore',  'Herbivore',  'Nectar',  'Insects', 'Parasite'],
        'Beetles & bugs': ['Herbivore', 'Carnivore', 'Nectar', 'Insects'],
        'Birds': ['Carnivore'],
        'Fishes': ['Carnivore', 'Plankton or Particles']
    }
    
    pd.Series(dct).str.join('|').str.get_dummies()
    
                        Carnivore  Herbivore  Insects  Nectar  Omnivore  Parasite  Plankton or Particles
    Anemones & allies           1          0        0       0         0         0                      0
    Ants, bees & wasps          0          1        1       1         1         1                      0
    Beetles & bugs              1          1        1       1         0         0                      0
    Birds                       1          0        0       0         0         0                      0
    Fishes                      1          0        0       0         0         0                      1
    

    更复杂
    但可能推荐

    from sklearn.preprocessing import MultiLabelBinarizer
    
    dct = {
        'Anemones & allies': ['Carnivore'],
        'Ants, bees & wasps': ['Omnivore',  'Herbivore',  'Nectar',  'Insects', 'Parasite'],
        'Beetles & bugs': ['Herbivore', 'Carnivore', 'Nectar', 'Insects'],
        'Birds': ['Carnivore'],
        'Fishes': ['Carnivore', 'Plankton or Particles']
    }
    
    s = pd.Series(dct)
    
    mlb = MultiLabelBinarizer()
    
    d = mlb.fit_transform(s)
    c = mlb.classes_
    pd.DataFrame(d, s.index, c)
    
                        Carnivore  Herbivore  Insects  Nectar  Omnivore  Parasite  Plankton or Particles
    Anemones & allies           1          0        0       0         0         0                      0
    Ants, bees & wasps          0          1        1       1         1         1                      0
    Beetles & bugs              1          1        1       1         0         0                      0
    Birds                       1          0        0       0         0         0                      0
    Fishes                      1          0        0       0         0         0                      1
    

    【讨论】:

    • @piRSquared 哇,这么好的答案,这么快,太好了。现在我还有一个问题,你是怎么知道的?因为我很难找到一些关于如何处理这个问题的文档,只是因为我不知道用谷歌搜索什么。有什么建议/提示,这样我下次就不必在 StackOverflow 上问愚蠢的问题了吗?
    • 这就是 Stackoverflow 的用途!你用谷歌搜索它,你尝试了一些东西,不能完全得到你需要的东西,问一个关于 SO 的问题。可能其他人也有同样的问题。我刚开始的时候问了一些不好的问题。你会好起来的。我们也旨在帮助您提出更好的问题。我鼓励您提出更多问题并最终回答一些问题。
    【解决方案2】:

    dict(d) 创建DataFrame,然后使用get_dummies

    pd.get_dummies(pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in d.items() ])).stack()).sum(level=1)
    Out[130]: 
                        Carnivore  Herbivore  Insects  Nectar  Omnivore  Parasite  \
    Anemones & allies           1          0        0       0         0         0   
    Ants, bees & wasps          0          1        1       1         1         1   
    Beetles & bugs              1          1        1       1         0         0   
    Birds                       1          0        0       0         0         0   
    Fishes                      1          0        0       0         0         0   
                        Plankton or Particles  
    Anemones & allies                       0  
    Ants, bees & wasps                      0  
    Beetles & bugs                          0  
    Birds                                   0  
    Fishes                                  1  
    

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 2016-02-16
      • 2021-06-16
      • 2015-08-11
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多