【问题标题】:How can I create a dataframe of dummies from a dict of lists of unequal length?如何从长度不等的列表中创建假人数据框?
【发布时间】:2019-08-16 06:55:04
【问题描述】:

我有一个字典,其中每个键都是一个行索引,每个值都是一个虚拟值列表。例如:

my_dict = {'row1': ['a', 'b'], 'row2': ['a'], 'row3': ['b', 'c']}

我可以用上述方法有效地创建一个假人数据框吗?

>>> df
      a      b      c
row1  True   True   False
row2  True   False  False
row3  False  True   True

【问题讨论】:

    标签: python pandas dummy-variable


    【解决方案1】:

    你可以使用pd.get_dummies:

    u = pd.DataFrame.from_dict(my_dict, orient='index')
    pd.get_dummies(u, prefix='', prefix_sep='').max(level=0, axis=1).astype(bool)
    
              a      b      c
    row1   True   True  False
    row2   True  False  False
    row3  False   True   True
    

    您也可以使用stackstr.get_dummies,这很简洁,但这会稍微慢一些。

    u.stack().str.get_dummies().max(level=0).astype(bool)
    
              a      b      c
    row1   True   True  False
    row2   True  False  False
    row3  False   True   True
    

    【讨论】:

    • 在我的数据集上,第一个解决方案平均为 7.15 毫秒,第二个解决方案平均为 11.7 毫秒。你能解释一下这两者是如何构建最终数据框的吗?
    • @JoeB pd.get_dummies 能够为多列生成一个热编码。在第二种情况下,str.get_dummies 在单列上工作,所以我们事先将数据堆叠起来。
    【解决方案2】:

    crosstab 带构造函数

    s=pd.DataFrame(list(my_dict.values()),index=my_dict.keys()).stack()
    
    pd.crosstab(s.index.get_level_values(0),s).astype(bool)
    Out[131]: 
    col_0      a      b      c
    row_0                     
    row1    True   True  False
    row2    True  False  False
    row3   False   True   True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2023-04-07
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多