【发布时间】: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 中的索引、映射、拆分和替换功能,但遗憾的是还没有解决。 我相信这很简单,并且已经有一种有效的方法来解决这个问题,希望:)
谢谢!!
【问题讨论】:
标签: python pandas loops replace iteration