закодировать список в ячейке в кадре данных с помощью sklearn - PullRequest
0 голосов
/ 08 марта 2019

У меня есть такой фрейм данных:

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 Ответ

1 голос
/ 08 марта 2019

Один из способов сделать это - разбить ячейки, содержащие списки, на отдельные строки, затем применить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...