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

2024-10-01 02:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:

  • df_components:唯一组件的列表(ID,描述)
  • dataset:CSV中的几行和几列(其中一列包含组件的描述)。你知道吗

我需要在dataset中根据df_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上的项数。你知道吗

如何使用在df_components上找到的项的ID创建这个新列?你知道吗


Tags: 数据idtruedfindexcomponents组件description
1条回答
网友
1楼 · 发布于 2024-10-01 02:34:18

你的逻辑似乎太复杂了。由于您当前正在从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”。你知道吗

使用分类数据的优势

  • 内存效率:字符串只存储一次。你知道吗
  • 结构:定义类别并有一个自动的数据验证层。你知道吗
  • 一致的:由于类别到代码的映射总是1对1的,所以即使添加了新的类别,它们也总是一致的。你知道吗

相关问题 更多 >