【问题标题】:split values of a dictionary into seperate panda dataframe columns -- make them dummy将字典的值拆分为单独的 panda 数据框列——使它们成为虚拟列
【发布时间】:2020-02-02 07:41:39
【问题描述】:

假设我们有一个这种格式的数据框:

id  properties
0   {"cat1":["p1","p2","p4"],"cat2":["p5", "p6"]}
1   {"cat1":["p3"],"cat2":["p7"]}

我们如何将其转换为这种格式?

id  p1    p2    p3    p4    p5    p6    p7
0   True  True  False True  True  True  False
1   False False True  False False False True

请记住,每个单元格中的值类型是字符串。 它只有两个类别:cat1 和 cat2

【问题讨论】:

    标签: python pandas dataframe dummy-variable


    【解决方案1】:

    使用itertools.chain.from_iterablestr.get_dummies

    from itertools import chain
    
    df.properties.apply(lambda s: ','.join(chain.from_iterable(s.values())))\
                 .str.get_dummies(sep=',')\
                 .astype(bool)
    

          p1     p2     p3     p4     p5     p6     p7
    0   True   True  False   True   True   True  False
    1  False  False   True  False  False  False   True
    

    【讨论】:

      【解决方案2】:

      使用stack + explode + get_dummies

      u = pd.DataFrame(df['properties'].tolist())
      
      u.stack().explode().add(',').sum(level=0).str.get_dummies(',')
      

         p1  p2  p3  p4  p5  p6  p7
      0   1   1   0   1   1   1   0
      1   0   0   1   0   0   0   1
      

      【讨论】:

        【解决方案3】:

        我会用get_dummies

        df.properties.map(lambda x : ','.join(sum(x.values(),[]))).str.get_dummies(',').astype(bool)
              p1     p2     p3     p4     p5     p6     p7
        0   True   True  False   True   True   True  False
        1  False  False   True  False  False  False   True
        

        【讨论】:

          【解决方案4】:

          将_index 设置为id。正如您所说,每个单元格都是一个字符串,因此您需要使用ast.literal_evaldf.properties 从dict 字符串转换为dict。接下来,使用str 方法获取cat1cat2 并将它们的列表和explode 组合到行并将结果分配给s。最后,使用选项dtype=bools 上调用pd.get_dummies 并在level=0 上调用max

          import ast
          
          df1 = df.set_index('id')
          df1.properties = df1.properties.map(ast.literal_eval)
          s = (df1.properties.str['cat1'] + df1.properties.str['cat2']).explode()
          pd.get_dummies(s, dtype=bool).max(level=0)
          
          Out[1035]:
                 p1     p2     p3     p4     p5     p6     p7
          id
          0   True   True   False  True   True   True   False
          1   False  False  True   False  False  False  True
          

          【讨论】:

            猜你喜欢
            • 2019-04-03
            • 1970-01-01
            • 1970-01-01
            • 2022-08-19
            • 2015-01-15
            • 2016-11-08
            • 1970-01-01
            相关资源
            最近更新 更多