展开 Pandas 列的所有类别中的缺失值
Expand a missing value in all categories of a column in Pandas
我有以下 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 中有效地执行此转换?
这是一种方法:
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
填充列表,因此 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 行。
我有以下 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 中有效地执行此转换?
这是一种方法:
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
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 行。