【问题标题】:Create a new column with the value found in another DataFrame使用在另一个 DataFrame 中找到的值创建一个新列
【发布时间】:2018-04-29 06:56:03
【问题描述】:

我有两个数据框:

  • df_components:唯一组件列表(ID、DESCRIPTION)
  • dataset:CSV 中的几行和几列(其中一列包含组件的描述)。

我需要根据df_componentsdataset中创建一个新列,其组件的ID。

我尝试过这样做:

根据索引创建df_componentsID

components = dataset["COMPDESC"].unique()
df_components = pd.DataFrame(components, columns=['DESCRIPTION'])
df_components.sort_values(by='DESCRIPTION', ascending=True, inplace=True)
df_components.reset_index(drop=True, inplace=True)
df_components.index += 1
df_components['ID'] = df_components.index

样本输出:

                                           DESCRIPTION   ID
1                                             AIR BAGS    1
2                                     AIR BAGS:FRONTAL    2
3               AIR BAGS:FRONTAL:SENSOR/CONTROL MODULE    3
4                                 AIR BAGS:SIDE/WINDOW    4

数据集中创建COMP_ID

def create_component_id_column(row):
    found = df_components[df_components['DESCRIPTION'] == row['COMPDESC']]
    return found.ID if len(found.index) > 0 else None

dataset['COMP_ID'] = dataset.apply(lambda row: create_component_id_column(row), axis=1)

但是这给了我错误ValueError: Wrong number of items passed 248, placement implies 1df_components 上的项目数为 248。

如何使用df_components 上的项目的 ID 创建这个新列?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您的逻辑似乎过于复杂。由于您目前正在从dataset创建df_components,更好的主意是将Categorical Datadataset 一起使用。这意味着您不需要创建df_components

    第 1 步

    dataset['COMPDESC'] 转换为分类。

    dataset['COMPDESC'] = dataset['COMPDESC'].astype('category')
    

    第 2 步

    从分类代码创建 ID。由于类别默认按字母顺序排序,并且索引从 0 开始,因此在代码中添加 1。

    dataset['ID'] = dataset['COMPDESC'].cat.codes + 1
    

    如果您愿意,可以将整个分类映射提取到字典:

    cat_map = dict(enumerate(dataset['COMPDESC'].cat.categories))
    

    请记住,如果您希望 ID 从 1 开始,则始终存在 1 个偏移量。此外,每次“DESCRIPTION”更改时,您都需要明确更新“ID”。

    使用分类数据的优势

    • 内存效率:字符串只存储一次。
    • 结构:您定义类别并拥有自动数据验证层。
    • 一致:由于类别到代码的映射始终是一对一的,因此即使添加了新类别,它们也将始终保持一致。

    【讨论】:

    • 感谢您的回答,@jpp。我了解使用分类数据的优势,但出于学习目的,您能否指出我的代码中缺少的导致错误的内容?我将按照您建议的方式更改代码,但我真的很想了解此错误的原因。
    • @JulianoNunesSilvaOliveira,老实说,我不够聪明,无法立即可视化代码的效果。如果您可以构建一个演示问题的数据框(有 10 行,而不是 248 行),并将edit 这个问题放入您的问题中,那么我可能可以为您调试。如果您需要这方面的帮助,请参阅 How to make good reproducible pandas examples
    • 我无法让pd.read_clipboard(sep='\s\s+')notebooks.azure.com 上工作,所以我将继续搜索导致此错误的原因。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2020-12-17
    • 2020-02-11
    • 2017-02-08
    • 2023-02-01
    • 2021-09-21
    相关资源
    最近更新 更多