如何在数据框python3的每一列中将字符串映射到数字ID

时间:2019-10-20 16:16:59

标签: python string dataframe mapping

我有一个数据框:

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列。谢谢

4 个答案:

答案 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)