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

时间:2019-03-08 17:46:04

标签: python pandas dataframe sklearn-pandas

我有一个像这样的数据框:

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

1 个答案:

答案 0 :(得分: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       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