猿问

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

我有一个这样的数据框:


df = pd.DataFrame([{'A': 1, 'B': 'p'}, {'A': 1, 'B': 'q'},  {'A': 2, 'B': 'o'},  {'A': 3, 'B': 'p'}])

df

   A  B

0  1  p

1  1  q

2  2  o

3  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  B

0  0  1

1  0  2

2  1  0

3  2  1


for col in df.columns:

    le = le.fit(df[col])

    df_decoded[col] = le.inverse_transform(df_encoded[col])


df_decoded


   A  B

0  1  p

1  1  q

2  2  o

3  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'] 的代码。


炎炎设计
浏览 147回答 1
1回答

凤凰求蛊

一种方法是将包含列表的单元格分解为单独的行,然后应用 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       B0  [0, 1]       11       0  [1, 2]2       1       03       2       1        A       B0  [1, 2]       p1       1  [p, q]2       2       o3       3       p
随时随地看视频慕课网APP

相关分类

Python
我要回答