为了账号安全,请及时绑定邮箱和手机立即绑定

使用 sklearn 在数据帧中的单元格中编码列表

使用 sklearn 在数据帧中的单元格中编码列表

炎炎设计 2021-11-30 17:02:03
我有一个这样的数据框:df = pd.DataFrame([{'A': 1, 'B': 'p'}, {'A': 1, 'B': 'q'},  {'A': 2, 'B': 'o'},  {'A': 3, 'B': 'p'}])df   A  B0  1  p1  1  q2  2  o3  3  p我可以用代码正确编码和解码。le = LabelEncoder()df_encoded = pd.DataFrame(columns=df.columns)df_decoded = pd.DataFrame(columns=df.columns)for col in df.columns:    df_encoded[col] = le.fit_transform(df[col])df_encoded   A  B0  0  11  0  22  1  03  2  1for col in df.columns:    le = le.fit(df[col])    df_decoded[col] = le.inverse_transform(df_encoded[col])df_decoded   A  B0  1  p1  1  q2  2  o3  3  p  现在如果我有一个这样的数据帧,我该如何编码和解码它?dj = pd.DataFrame([{'A': [1,2], 'B': 'p'}, {'A': 1, 'B': ['p','q']},  {'A': 2, 'B': 'o'},  {'A': 3, 'B': 'p'}])我想为 ['p','q'] 的每个单元格设置一个代码,而不是 ['p','q'] 的代码。
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

一种方法是将包含列表的单元格分解为单独的行,然后应用 LabelEncoder,然后将这些行组合回列表:


df_encoded = pd.DataFrame()

df_decoded = pd.DataFrame()


def t1(z):

    zz = pd.DataFrame([np.array(x).reshape(-1) for x in z.values.tolist()])

    dt = zz.dtypes[0]

    return (zz

        .stack()

        .reset_index(level=1, drop=True)

        .to_frame(col)

        .astype(dt))


def t2(z):

    return z.groupby(level=0).apply(lambda x: np.squeeze(x.values.tolist()))


for col in dj.columns:

    d = t1(dj[col])

    d['x'] = le.fit_transform(d[col])

    df_encoded[col] = t2(d['x'])


print(df_encoded)


for col in dj.columns:

    d = t1(dj[col])

    m = le.fit(d[col])


    d = t1(df_encoded[col])

    d['x'] = m.inverse_transform(d[col])

    df_decoded[col] = t2(d['x'])


print(df_decoded)

输出:


        A       B

0  [0, 1]       1

1       0  [1, 2]

2       1       0

3       2       1


        A       B

0  [1, 2]       p

1       1  [p, q]

2       2       o

3       3       p


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信