我有两个DataFrame:
df_components
:唯一组件列表(ID,DESCRIPTION)dataset
:CSV中的多个行和列(其中一列包含组件的说明)。我需要根据dataset
在df_components
中创建一个包含组件ID的新列。
我试着这样做:
根据索引
创建df_components
和ID
列
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创建此新列?
答案 0 :(得分:2)
你的逻辑似乎过于复杂。由于您目前正在df_components
创建 dataset
,因此更好的办法是将Categorical Data与dataset
一起使用。这意味着您无需创建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”。
使用分类数据的优点