通过遍历数据框的单列中的名称值替换多个 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
创建映射系列
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
我有这两个数据框,一个用于产品文件,一个用于类别文件(来自 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
创建映射系列
Split
和explode
category_id
列- 使用映射系列 中的值替换展开的
- 按索引对列进行分组并使用
join
聚合列
catgeory_id
中的值
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