通过迭代,将多个 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
创建映射系列
Split
和 explode
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数据框中单列中的值转换为文本清理中的小写[重复]