【问题标题】:Expand a missing value in all categories of a column in Pandas在 Pandas 中展开列的所有类别中的缺失值
【发布时间】:2021-07-09 14:45:00
【问题描述】:

我有以下 pd.DataFrame 表示优化问题的约束。

          FEATURE     COLOR        CLASS       CONSTRAINTS
0         1.0         NaN          NaN         0.20
1         3.0         NaN          NaN         0.20
2         1.0         1.0          NaN         0.15
3         1.0         NaN            b        -0.05
4         1.0         1.0            a        -0.07
5         1.0         1.0            b        -0.10
6         3.0         1.0          NaN         0.10
7         NaN         NaN          NaN         0.20

这里FEATURE代表一个可能值为[1,2,3]的分类变量,COLOR代表一个可能值为[1,2]的分类变量,CLASS是另一个可能值为[a,b,c,d]的分类变量。

此处的缺失值具有“所有其他值”的含义。 从这个意义上说,数据框是包含所有或部分列类别组合的更大数据框的压缩版本。

我想在这里做的是将 NaN 值“扩展”为每个单独的列可以表示的所有可能值。 例如,第 0 行将扩展为总共 8 行,这是“免费”功能的乘积,即 COLOR 的可能值 [1,2] 和 CLASS 的可能值 `[a,b,c,d]``

new     FEATURE   COLOR    CLASS  CONSTRAINTS
0       1         1        a      0.2
1       1         1        b      0.2
2       1         2        a      0.2
3       1         2        b      0.2
4       1         1        a      0.2
5       1         1        b      0.2
6       1         2        a      0.2
7       1         2        b      0.2

如何在 Pandas 中有效地执行这种转换?

【问题讨论】:

  • 请分享完整数据框的预期输出。如果@MustafaAdyin 解决方案是您所追求的,请接受它

标签: python pandas dataframe categorical-data


【解决方案1】:

这是一种方法:

mapping = {'FEATURE': [1, 2, 3], 'COLOR': [1, 2], 'CLASS': ['a', 'b', 'c', 'd']}
cols = mapping.keys()

for col in cols:
    df[col] = df[col].apply(lambda x: mapping[col] if pd.isna(x) else x)
    df = df.explode(col)

对于每个感兴趣的列,我们用可能的值填充 NaN(注意 fillna doesn't 填充列表,因此 apply)。然后我们explode 这样填充的列并对所有三个列重复此操作。

我们最后得到df

  FEATURE COLOR CLASS  CONSTRAINTS
0       1     1     a         0.20
0       1     1     b         0.20
0       1     1     c         0.20
0       1     1     d         0.20
0       1     2     a         0.20
0       1     2     b         0.20
0       1     2     c         0.20
0       1     2     d         0.20
1       3     1     a         0.20
1       3     1     b         0.20
1       3     1     c         0.20
1       3     1     d         0.20
1       3     2     a         0.20
1       3     2     b         0.20
1       3     2     c         0.20
1       3     2     d         0.20
2       1     1     a         0.15
2       1     1     b         0.15
2       1     1     c         0.15
2       1     1     d         0.15
3       1     1     b        -0.05
3       1     2     b        -0.05
4       1     1     a        -0.07
5       1     1     b        -0.10
6       3     1     a         0.10
6       3     1     b         0.10
6       3     1     c         0.10
6       3     1     d         0.10
7       1     1     a         0.20
7       1     1     b         0.20
7       1     1     c         0.20
7       1     1     d         0.20
7       1     2     a         0.20
7       1     2     b         0.20
7       1     2     c         0.20
7       1     2     d         0.20
7       2     1     a         0.20
7       2     1     b         0.20
7       2     1     c         0.20
7       2     1     d         0.20
7       2     2     a         0.20
7       2     2     b         0.20
7       2     2     c         0.20
7       2     2     d         0.20
7       3     1     a         0.20
7       3     1     b         0.20
7       3     1     c         0.20
7       3     1     d         0.20
7       3     2     a         0.20
7       3     2     b         0.20
7       3     2     c         0.20
7       3     2     d         0.20

如预期的那样有 52 行。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2019-10-22
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多