【问题标题】:how to mapping string to numerical ID in each column of dataframe python3如何在数据框python3的每一列中将字符串映射到数字ID
【发布时间】:2020-02-16 20:52:42
【问题描述】:

我有一个数据框:

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

【问题讨论】:

标签: python string dataframe mapping


【解决方案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

【讨论】:

  • 酷,可以跳过构建d_userd_item 以节省内存吗?因为我的user 很大。
  • @jason 我已经编辑了答案。应该这样做。
【解决方案2】:

您可以使用.groupby().ngroup() 的组合将每列中的名称替换为唯一编号。

df['user'] = df.groupby(['user']).ngroup()
df['item'] = df.groupby(['item']).ngroup()

【讨论】:

    【解决方案3】:

    你应该先建立一个从用户到整数的映射,然后用 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)
    

    【讨论】:

      【解决方案4】:

      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)
      

      【讨论】:

      • 在这种情况下添加一个新库是一种解决方案吗?
      猜你喜欢
      • 2019-11-13
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 2020-06-17
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多