【问题标题】:Read CSV and replace a column based on keyword list读取 CSV 并根据关键字列表替换列
【发布时间】:2016-09-16 20:47:52
【问题描述】:

我是 Python 新手,希望能获得有关如何解决此问题的帮助。这是我正在尝试做的事情:

  1. 读取包含交易列表的 CSV 文件。每行有 6 列。
  2. 对于每一行,将DESCRIPTION 列与关键字列表进行比较,以查看是否有任何单词与关键字列表中的一个匹配。
    |Col0 | Col1 | Col2 | Col3 "DESCRIPTION" | Col4 | Col5 "CATEGORY"|

  3. 如果任何单词与关键字列表中的某些内容匹配,请将 CATEGORY 列替换为与该特定关键字列表对应的新条目(例如 "Groceries")。

  4. 继续浏览每一行,将其与几个关键字列表进行比较。如果匹配,请将每行中的第 5 列 (CATEGORY) 替换为相应的值。
  5. 保存到新的 CSV 文件。

这是我目前所拥有的:

import csv

grocery_keyword = ['GIANT', 'SAFEWAY', 'KROGER']

with open('Trans.csv') as csvFile:
    reader = csv.reader(csvFile, delimiter=",")
    my_list = list(reader)

    for row in my_list:
        for index, item in enumerate(row):
            if any grocery_keyword in row:
                row[index] = item.replace("", "Grocery")

newCSVFile = 'newCSVFile.csv'
    with open(newCSVFile, "w") as output:
        writer = csv.writer(output, delimiter=",", quotechar='"',
                            quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
        writer.writerows(my_list)
csvFile.close()

在这里使用列表是否正确?列和关键字列表的对比应该怎么做?

【问题讨论】:

  • 如果描述类别匹配多个关键字,您希望在 CATEGORY 中得到什么?
  • 好问题,我还没有考虑这么远。我计划让列表具有互斥的关键字。对于与关键字不匹配的其余行,我将不得不手动对其进行排序。

标签: python csv


【解决方案1】:

我发现 pandas 库非常适合这种类型的东西。我确信 find_cat def 可以加快一点,但想了解将搜索和替换应用于所传达的列的想法。

import pandas as pd


def find_cat(desc, cat_dict):
    cat_list = []
    for cat in cat_dict:
        for w in cat_dict[cat]:
            if w in desc:
                cat_list.append(cat)
    return cat_list


cat_d = {
    "cat1": ["1_word_1", "1_word_2"],
    "cat2": ["2_word_1", "2_word_2"],
    "cat3": ["3_word_1", "3_word_2"]
}


df = pd.read_csv('in.csv')
df["category"] = df[["description"]].apply(lambda row: find_cat(row["description"], cat_d), axis=1) 
df.to_csv('out.csv')

in.csv 包含的位置:

col1,col2,col3,col4,description,category
0,0,0,0,1_word_1,
0,0,0,0,1_word_2,
0,0,0,0,1_word_1,
0,0,0,0,3_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_2,
0,0,0,0,1_word_1,
0,0,0,0,2_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_2,
0,0,0,0,1_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_1,
0,0,0,0,2_word_2,
0,0,0,0,1_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_1,
0,0,0,0,1_word_2,
0,0,0,0,1_word_1,
0,0,0,0,2_word_1,

并生成 out.csv:

,col1,col2,col3,col4,description,category
0,0,0,0,0,1_word_1,cat1
1,0,0,0,0,1_word_2,cat1
2,0,0,0,0,1_word_1,cat1
3,0,0,0,0,3_word_1,cat3
4,0,0,0,0,1_word_1,cat1
5,0,0,0,0,1_word_1,cat1
6,0,0,0,0,1_word_2,cat1
7,0,0,0,0,1_word_1,cat1
8,0,0,0,0,2_word_1,cat2
9,0,0,0,0,1_word_1,cat1
10,0,0,0,0,1_word_2,cat1
11,0,0,0,0,1_word_1,cat1
12,0,0,0,0,1_word_1,cat1
13,0,0,0,0,1_word_1,cat1
14,0,0,0,0,2_word_2,cat2
15,0,0,0,0,1_word_1,cat1
16,0,0,0,0,1_word_1,cat1
17,0,0,0,0,1_word_1,cat1
18,0,0,0,0,1_word_1,cat1
19,0,0,0,0,1_word_2,cat1
20,0,0,0,0,1_word_1,cat1
21,0,0,0,0,2_word_1,cat2

【讨论】:

  • 向字典中添加特定字符串时出现错误。我认为这是撇号或哈希标签的问题,但我不知道如何解决它。字符串:“ZOE'S #2”,例如“cat1”:[“1_word_1”,“ZOE'S #2”],我试过了:1. “ZOE'S #2”(原样) - 失败,抛出空值错误,2. “ZOE\'S #2” - 完成,但不匹配相关行,3. "ZOE\'S \# 2" - 完成,但不匹配相关行,我错过了什么?
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多