python - 如何融化 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 上应用融化以节省内存?
解决方案
让我们尝试使用set_index
、stack
和mask
:
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
推荐阅读
- kubernetes - Kubernetes - traefik external ip stuck in pending
- swift - Swift String hasPrefix 使用字符串数组
- android - 底部导航和图标大小
- angular - 打字稿中的类型推断不起作用
- python - 生成不相交的多边形或其他方式来计算点周围变量的总和
- c++ - C ++以其他方式增加指针
- jquery - Rails 使用 jQuery 重定向到带有参数的 url
- c - 打印二维矩阵?
- jenkins - 詹金斯管道sh不适用于少数命令
- entity-framework-core - EF Core 非原始类型值对象作为主键?