使用在另一个DataFrame中找到的值创建一个新列

时间:2018-04-28 22:09:17

标签: python pandas

我有两个DataFrame:

  • df_components:唯一组件列表(ID,DESCRIPTION)
  • dataset:CSV中的多个行和列(其中一列包含组件的说明)。

我需要根据datasetdf_components中创建一个包含组件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 1。将df_components上的项目数量设为248。

如何使用df_components上找到的项目的ID创建此新列?

1 个答案:

答案 0 :(得分:2)

你的逻辑似乎过于复杂。由于您目前正在df_components 创建 dataset,因此更好的办法是将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个偏移量。此外,每次“描述”更改时,您都需要明确更新“ID”。

使用分类数据的优点

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