如何在Python3的数据框中将字符串映射为数字ID?

3

我有一个数据框:

import pandas as pd
d = {'user': ['bob','alice','bob'], 'item': 
['apple','coconut','pear']}
df = pd.DataFrame(data=d)




    user    item
0   bob     apple 
1   alice   coconut 
2   bob     pear

我的目标是将每个列中的字符串映射到一个递增的ID(从0开始),如下:

    user    item
0   0       0
1   1       1
2   0       2

例如,对于列user[bob,alice]将映射为[0,1]。目标是为了节省数据框的内存。
此外,是否可能指定要映射的列?例如,仅映射user列。谢谢。

请查看此链接:https://stackoverflow.com/a/58161742/11409321 - Sultan Singh Atwal
4个回答

4
您可以使用.groupby().ngroup()相结合的方式,将每列中的名称替换为唯一的数字。
df['user'] = df.groupby(['user']).ngroup()
df['item'] = df.groupby(['item']).ngroup()

2

首先,您应该建立一个从用户到整数的映射,然后使用Pandas内置的pandas.Series.map进行替换:

import pandas as pd

d = {'user': ['bob','alice','bob'],
     'item': ['apple','coconut','pear']}
df = pd.DataFrame(data = d)

unique_users = df.user.unique()
user_map = {u: i for i, u in enumerate(unique_users)}
df.user = df.user.map(user_map)

1
你可以尝试这个:

import pandas as pd
d = {'user': ['bob','alice','bob'], 'item': 
['apple','coconut','pear']}
df = pd.DataFrame(data=d)
col_user = df['user'].unique()
col_item = df['item'].unique()
d_user = pd.Series(range(len(col_user)), index = col_user).to_dict()
d_item = pd.Series(range(len(col_item)), index = col_item).to_dict()
df = df.replace({'user': d_user, 'item': d_item}) 
df

1
很酷,可以跳过构建 d_userd_item 以节省内存吗?因为我的 user 很大。 - jason
2
@jason 我已经编辑了答案。这样应该可以了。 - Sultan Singh Atwal

0

SKLearn有一个库,可以转换和反向转换pandas系列

>>> from sklearn.preprocessing import LabelEncoder
>>> import pandas as pd
>>> import numpy as np
>>>
>>> df = pd.DataFrame(data = {
... 'user': ['bob','alice','bob'], 'item': ['apple','coconut','pear']
... })
>>>
>>> le = LabelEncoder()
>>> le.fit_transform(df["user"])
array([1, 0, 1])
>>> le.inverse_transform(np.array([1,0,1]))
array(['bob', 'alice', 'bob'], dtype=object)

在这种情况下,添加一个新的库是一个解决方案吗? - Farrukh Normuradov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接