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

标签 python pandas

我有两个数据框:

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

我需要根据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:错误的项目数量通过了248,放置意味着1df_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/

相关文章:

python - 如何使用一系列列名从 Pandas 数据框中获取一个系列?

python - 在 Pandas 中应用groupby后如何计算列的正数和负数

python pandas - 应用于 csv 的函数不持久

python - 为什么我得到 __init__() takes 1 positional argument but 2 were given?

python - FastAPI 应用程序在本地运行但不在 Docker 容器中

Python Flask-WTF - 使用相同的表单模板进行添加和编辑操作

python - 如何在python中格式化数据以进行面板数据分析?

python - Pandas :如何 groupby/pivot 保留 NaNs?将 float 转换为 str 然后再转换回 float 有效但看起来很复杂

python - 如何配置 pycharm/intellij idea 来运行 tox 测试

python - Python Pandas 中的数据提取