我有一个像这样的数据框:
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']的代码编写。
答案 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