【问题标题】:Map columns' values to another column [duplicate]将列的值映射到另一列[重复]
【发布时间】:2020-10-04 22:35:45
【问题描述】:

我有一个包含一些客户信息的数据集,其中一列包含设备代码(标识所使用的设备)。我需要将这些代码翻译成实际的型号名称。 我还有第二张表,其中有一列保存设备代码(与第一张表相同),另一列保存相应的型号名称。 我知道这可能看起来微不足道,我已经设法通过使用 for 循环、.loc 方法和条件替换将代码转换为模型,但我正在寻找更结构化的解决方案。

这是数据的摘录。

df = pd.DataFrame(
    {
        'Device_code': ['SM-A520F','SM-A520F','iPhone9,3','LG-H860', 'WAS-LX1A', 'WAS-LX1A']
    }
)
transcription_table=pd.DataFrame(
    {
        'Device_code': ['SM-A520F','SM-A520X','iPhone9,3','LG-H860', 'WAS-LX1A', 'XT1662','iPhone11,2'],
        'models': ['Galaxy A5(2017)','Galaxy A5(2017)','iPhone 7','LG G5', 'P10 lite', 'Motorola Moto M','iPhone XS']
    }
)

基本上每次两个表的device_code列匹配时我都需要获取设备的显式模型,并用实际模型名称覆盖第一个表(df)的device_code(或者,它可以是将同一行写入新创建的列,这不是问题)。

感谢您的帮助。

【问题讨论】:

    标签: python pandas dictionary


    【解决方案1】:

    将您的transcription_table 转换为实际映射(也称为字典),然后使用Series.map

    transcription_dict = dict(transcription_table.values)
    df['models'] = df['Device_code'].map(transcription_dict)
    print(df)
    

    输出:

      Device_code           models
    0    SM-A520F  Galaxy A5(2017)
    1    SM-A520F  Galaxy A5(2017)
    2   iPhone9,3         iPhone 7
    3     LG-H860            LG G5
    4    WAS-LX1A         P10 lite
    5    WAS-LX1A         P10 lite
    

    【讨论】:

    • 正是我需要的,谢谢!
    【解决方案2】:

    这只是一种解决方案:

    # Dictionary that maps device codes to models
    mapping = transcription_table.set_index('Device_code').to_dict()['models']
    
    # Apply mapping to a new column in the dataframe
    # If no match is found, None will be filled in
    df['Model'] = df['Device_code'].apply(lambda x: mapping.get(x))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多