将字符列编码为序号,但保留sam中的数字列

2024-06-12 13:05:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下的数据框:

test = {"viral": "pos", "Status": "positive", "Age": 59, "score": 5}
test2 = {"viral": "neg"}
df = pd.DataFrame.from_dict([test, test2])

我想将字符列(病毒、状态)编码为序数,但不要使用数值。所需的输出是具有相同列名的numpy数组。你知道吗

如果我使用sklearn的OrdinalEncoder,它不会处理NaN值。即使没有NaN值,它仍然会对数字列进行顺序编码。我想在字符列中用0填充NaN值,但在数字列中保留NaN。你知道吗

最简单的方法是什么?你知道吗

所需输出(在numpy数组中):

    Age    Status  score viral
0  59.0         1    5.0     1
1   NaN         0    NaN     0

谢谢! 杰克

编辑:在使用enc=OrdinalEncoder()时,我还需要一个从编码值到原始值的映射,如{i: dict(enumerate(v)) for i, v in enumerate(enc.categories_)}(参见Vectorize 2D character array column-wise


Tags: testnumpy编码agestatus数字数组nan
2条回答

使用^{}

enc = sklearn.preprocessing.LabelEncoder()

mask = df.dtypes.eq(np.object)
df.loc[:, mask] = df.loc[:, mask].astype(str).apply(enc.fit_transform)

为了能够^{},您可以创建一个defaultdictLabelEncoderskey是您的选择。我建议使用列名:直观和简单

from collections import defaultdict
enc = defaultdict(sklearn.preprocessing.LabelEncoder)

mask = df.dtypes.eq(np.object)
df.loc[:, mask] = df.loc[:, mask].astype(str).apply(lambda s: enc[s.name].fit_transform(s))

    Status  viral
0   1       1
1   0       0

^{}

df.loc[:, mask].apply(lambda s: enc[s.name].inverse_transform(s))

    Status      viral
0   positive    pos
1   NaN         neg

更新,当有NaN时,它会将代码cat为-1,如果需要NaN,可以使用replace转换回来

df=pd.DataFrame([test,test2])
df.dtypes
Out[152]:
Age       float64
Status     object
score     float64
viral      object
dtype: object
listc=df.columns[df.dtypes=='object']

for x in listc:
    df[x]=df[x].astype('category').cat.codes

df
Out[156]: 
    Age  Status  score  viral
0  59.0       0    5.0      1
1   NaN      -1    NaN      0

相关问题 更多 >