首页 > 解决方案 > 如何融化 0 和 1 的数据框并只保留 1

问题描述

这是我的原始数据框:

Label 1 | Label 2 | Label 3 | Variable 1 | Variable 2
-------------------------------------------------------
Blabla1 |   Hop1  |  Hip1   |   0        |   1
Blabla2 |   Hop2  |  Hip2   |   1        |   0
Blabla3 |   Hop3  |  Hip3   |   1        |   1
Blabla4 |   Hop4  |  Hip4   |   0        |   0

我的目标是将变量 1 和变量 2 放入行中,如果它们有 1 的话。对于上面的示例,异常结果将是:

Label 1 | Label 2 | Label 3 | Variable   
------------------------------------------
Blabla1 |   Hop1  |  Hip1   | Variable 2
Blabla2 |   Hop2  |  Hip2   | Variable 1
Blabla3 |   Hop3  |  Hip3   | Variable 1
Blabla3 |   Hop3  |  Hip3   | Variable 2

第 3 行重复两次,因为它有 2 个变量,第 4 行消失,因为它只有 0。

我找到了一个解决方案,使这项工作具有pandas.melt功能:

melt_DF = df.melt(id_vars=['Label 1', 'Label 2', 'Label 3'], value_vars=['Variable 1', 'Variable 2'])
melt_DF = melt_DF[melt_DF['value'] == 1].drop(columns='value', axis=1)

我的问题是我的 DataFrame 更大,大多数值都是 0 。在删除第二行中的大部分行之前,创建第一个 melt_DF 会占用太多内存。有没有办法只在 1s 上应用融化以节省内存?

标签: pythonpandasdataframe

解决方案


让我们尝试使用set_indexstackmask

df.set_index(['Label 1', 'Label 2', 'Label 3'], inplace=True)
df = df.mask(df == 0).stack().reset_index()
df

输出:

   Label 1  Label 2  Label 3     level_3    0
0  Blabla1    Hop1    Hip1    Variable 2  1.0
1  Blabla2    Hop2    Hip2    Variable 1  1.0
2  Blabla3    Hop3    Hip3    Variable 1  1.0
3  Blabla3    Hop3    Hip3    Variable 2  1.0

并且,要进行一些列重命名和清理以匹配预期输出:

df.mask(df1 == 0).rename_axis('Variable', axis=1).stack().reset_index().drop(0, axis=1)

输出:

   Label 1  Label 2  Label 3    Variable
0  Blabla1    Hop1    Hip1    Variable 2
1  Blabla2    Hop2    Hip2    Variable 1
2  Blabla3    Hop3    Hip3    Variable 1
3  Blabla3    Hop3    Hip3    Variable 2

推荐阅读