我有一个数据框:
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
列。谢谢
答案 0 :(得分:4)
您可以结合使用.ngroup()
和df['user'] = df.groupby(['user']).ngroup()
df['item'] = df.groupby(['item']).ngroup()
来用唯一的数字替换每一列中的名称。
collections.Counter
答案 1 :(得分: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
答案 2 :(得分:1)
您应该首先建立一个从用户到整数的映射,然后使用内置的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)
答案 3 :(得分:0)
SKLearn 有一个用于变换和逆变换熊猫系列的库
>>> 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)