我有两个数据框:
df_components
:唯一组件列表(ID、描述)数据集
:CSV 中的几行和几列(其中一列包含组件的描述)。
我需要根据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:错误的项目数量通过了248,放置意味着1
。 df_components
上的项目数为 248。
如何使用 df_components
上找到的项目的 ID 创建这个新列?
最佳答案
你的逻辑似乎过于复杂。由于您当前正在从数据集
创建df_components
,所以更好的主意是使用 Categorical Data与数据集
。这意味着您不需要创建df_components
。
第 1 步
将数据集['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”。
使用分类数据的优点
- 内存效率:字符串仅存储一次。
- 结构:您定义类别并具有自动数据验证层。
- 一致:由于类别到代码的映射始终是一对一的,因此即使添加新类别,它们也始终保持一致。
关于python - 使用另一个 DataFrame 中找到的值创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50081500/