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

encode list in a cell in a dataframe with 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'].[=13 的代码=]

一种方法是将包含列表的单元格分解为单独的行,然后应用 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