通过遍历数据框的单列中的名称值替换多个 ID 值

Replace Multiple ID Values by Name Values in a dataframe's single column by iterating through

我有这两个数据框,一个用于产品文件,一个用于类别文件(来自 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。 我可能觉得我需要在 product csv 的 category_id 列中迭代以获取用逗号分隔的值然后进行替换或其他操作??!

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

谢谢!!

解决方案

  • 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