通过迭代,将多个 ID 值替换为数据框单列中的名称值

Posted

技术标签:

【中文标题】通过迭代,将多个 ID 值替换为数据框单列中的名称值【英文标题】:Replace Multiple ID Values by Name Values in a dataframe's single column by iterating through 【发布时间】:2022-01-16 07:13:31 【问题描述】:

我有这两个数据框,一个用于产品文件,一个用于类别文件(来自 CSV):

产品文件 csv:

prod_id prod_name category_id
123 Red T-Shirt 501,502,999
345 Blue Dress 601,602

分类文件 csv:

category_id category_name
501 Mens
502 T-Shirts
601 Women
602 Dresses
999 Sale

预期输出为 csv:

prod_id prod_name category_id category_name
123 Red T-Shirt 501,502,999 Mens,T-Shirts,Sale
345 Blue Dress 601,602 Women,Dresses

到目前为止的代码:

import pandas as pd

df_products = pd.read_csv("products.csv", dtype="str")
df_categories = pd.read_csv("categories.csv", dtype="str")

cached_prod_id = df_products["prod_id"]
cached_prod_name = df_products["prod_name"]
cached_prod_category_id = df_products["category_id"]

cached_category_id = df_categories["category_id"]
cached_category_name = df_categories["category_name"]

inner_join = pd.merge(df_products,df_categories, on="category_id", how="category_name")

print(inner_join)

Error:

Traceback (most recent call last):
  File "C:\Users\Admin\projects\python\catagories_builder.py", line 29, in <module>
    inner_join = pd.merge(df_products,
  File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\pandas\core\reshape\merge.py", line 106, in merge
    op = _MergeOperation(
  File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\pandas\core\reshape\merge.py", line 699, in __init__
    ) = self._get_merge_keys()
  File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\pandas\core\reshape\merge.py", line 1096, in _get_merge_keys
    right_keys.append(right._get_label_or_level_values(rk))
  File "C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\pandas\core\generic.py", line 1779, in _get_label_or_level_values
    raise KeyError(key)
KeyError: 'category_id'

我相信这显然不是正确的代码,甚至方法也不正确;因为我还是新手,还在学习 python/pandas。 我可能有一种感觉,我需要在产品 csv 的 category_id 列中进行迭代,以获取用逗号分隔的值然后执行替换或其他操作??!

我已经探索过 pandas 中的索引、映射、拆分和替换功能,但遗憾的是还没有解决。 我相信这很简单,并且已经有一种有效的方法来解决这个问题,希望:)

谢谢!!

【问题讨论】:

【参考方案1】:

解决方案

df_categories 创建映射系列 Splitexplode category_id 列 使用映射系列中的值替换展开的catgeory_id 中的值 按索引对列进行分组并使用join 聚合列
d = df_categories.astype(str).set_index('category_id')['category_name']

df_products['category_name'] = (
    df_products['category_id'].str.split(',')
    .explode().map(d).groupby(level=0).agg(','.join)
)

>>> df_products

   prod_id    prod_name  category_id       category_name
0      123  Red T-Shirt  501,502,999  Mens,T-Shirts,Sale
1      345   Blue Dress      601,602       Women,Dresses

【讨论】:

谢谢舒巴姆!!我很快尝试了它,它似乎工作正常!但是,我仍然可能需要对其进行一些调整,因为目前在使用我拥有的真实数据时,我会得到一些与类别名称连接的 category_id!但是谢谢你,非常感谢你的解决方案,希望我能在我的解决方案中使用它。 只是一个更新.. 这是我在将它与真实数据一起使用时遇到的问题,其中映射出现不正确并且带有名称的 ID 的连接:( imgur.com/a/uZQbOKuimgur.com/a/Eu34Trl @TheMissingNTLDR 我已经编辑了答案。 这是一个美女!绝对像一个魅力! Bahut badia :) 谢谢!!!

以上是关于通过迭代,将多个 ID 值替换为数据框单列中的名称值的主要内容,如果未能解决你的问题,请参考以下文章

使用较低的函数将pyspark数据框中单列中的值转换为文本清理中的小写[重复]

当id与输入框名称扩展名id匹配时,如何在单列中将动态输入框值插入表中

C#:用 CSV 中的单列填充组合框

根据单独的列表替换多个字符串/值

将多个火花数据框列转换为具有列表类型的单列

数据帧到 RDD[Row] 用空值替换空间