首页 > 解决方案 > 基于整个数据帧的编码标签列

问题描述

我有熊猫数据框:

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

但是,有没有更好的方法呢?

标签: pythonpandas

解决方案


你可以检查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

推荐阅读