python - 基于整个数据帧的编码标签列
问题描述
我有熊猫数据框:
df = pd.DataFrame([[1,0,0,1], [0,1,0,0], [0,0,0,0], [1,0,0,0]], columns=list("ABCD"))
>>> df
A B C D
0 1 0 0 1
1 0 1 0 0
2 0 0 0 0
3 1 0 0 0
我想用标签创建一个与 1 和 0 相同高度的单列数据框,df
对于一行中的 1 和 0 的每个组合,它分配一个不同的类(最好是数字),即这个 df 应该如下所示:
>>> df_labels
x
0 0
1 1
2 2
3 3
寻找基于诸如 pandas 或 sklearn 等库中已内置函数的解决方案,而不是从头开始编写代码,尽管感谢您提供任何帮助。
我现在提出了这样的解决方案:
from sklearn.preprocessing import LabelEncoder
labels = []
for i in range(0, len(df)):
# create string from every row
val = "".join([str(x) for x in df.loc[i]])
labels.append(val)
# encode numeric labels for strings created
enc = LabelEncoder()
enc.fit(labels)
df_labels = pd.DataFrame(enc.transform(labels))
>>> df_labels
0
0 3
1 1
2 0
3 2
但是,有没有更好的方法呢?
解决方案
你可以检查factorize
pd.factorize(df.apply(tuple,1))[0]
array([0, 1, 2, 3])
pd.Series(pd.factorize(df.apply(tuple,1))[0])
0 0
1 1
2 2
3 3
dtype: int64
推荐阅读
- java - 为什么这段代码调用私有方法?
- node.js - 如何正确更新 module.exports?
- cors - Haproxy CORS 请求的资源上不存在“Access-Control-Allow-Origin”标头
- python - 在 Python 中调试 xml ElementTrees
- apache-flink - Flink example job of long-running streaming processing
- java - 创建页面加载动画是spring boot
- python - Python:根据其值将一列拆分为两列
- html - 如何使用 CSS 在顶部和底部制作一个打开的盒子作为容器?
- python - 分配器 (GPU_0_bfc) 尝试分配内存不足
- sql - 在 PostgreSQL 12 上按 id(唯一)分组的一次查询中同时获取房间成员、房间所有者和管理员