【问题标题】:get_dummies of dataframe with incomplete data using pandas使用 pandas 获取数据不完整的数据帧的假人
【发布时间】:2020-04-08 12:25:45
【问题描述】:

我有这个包含分类和非分类数据的 DataFrame,我想对其进行虚拟编码,但并非所有我知道可能的虚拟值都存在于数据中。

例如,让我们使用以下 DataFrame:

>>> df = pd.DataFrame({"a": [1,2,3], "b": ["x", "y", "x"], "c": ["h", "h", "i"]})
>>> df
   a  b  c
0  1  x  h
1  2  y  h
2  3  x  i

a 具有非分类值,但列 bc 都是分类值。

现在假设列b 可以包含类别xyz,列c 可以包含类别hijk

>>> dummy_map = {"b": ["x", "y", "z"], "c": ["h", "i", "j", "k"]}

我想对其进行编码,以便生成的数据帧如下:

>>> df_encoded
    a  b_x   b_y   b_z  c_h   c_i   c_j   c_k
0   1   1     0     0    1     0     0     0
1   2   0     1     0    1     0     0     0
2   3   1     0     0    0     1     0     0

我目前的解决方案如下:

df_encoded = pd.get_dummies(df)
for k, v in dummy_map.items():
  for cat in v:
    name = k + "_" + cat
    if name not in result:
      df_encoded[name] = 0

但在我看来,这有点低效和不雅。 那么有没有更好的解决方案呢?

【问题讨论】:

    标签: python pandas dummy-variable


    【解决方案1】:

    Index.union与列表理解生成的vae值以及f-strings和DataFrame.reindex一起使用:

    c = [f'{k}_{x}' for k, v in dummy_map.items() for x in v]
    print (c)
    ['b_x', 'b_y', 'b_z', 'c_h', 'c_i', 'c_j', 'c_k']
    
    df_encoded = pd.get_dummies(df)
    
    vals = df_encoded.columns.union(c, sort=False)
    df_encoded = df_encoded.reindex(vals, axis=1, fill_value=0)
    print (df_encoded)
       a  b_x  b_y  c_h  c_i  b_z  c_j  c_k
    0  1    1    0    1    0    0    0    0
    1  2    0    1    1    0    0    0    0
    2  3    1    0    0    1    0    0    0
    

    如果值应该在union中排序:

    df_encoded = pd.get_dummies(df)
    
    vals = df_encoded.columns.union(c)
    df_encoded = df_encoded.reindex(vals, axis=1, fill_value=0)
    print (df_encoded)
       a  b_x  b_y  b_z  c_h  c_i  c_j  c_k
    0  1    1    0    0    1    0    0    0
    1  2    0    1    0    1    0    0    0
    2  3    1    0    0    0    1    0    0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多