Python/Numpy(CSV):查找值,附加另一个 csv

Posted

技术标签:

【中文标题】Python/Numpy(CSV):查找值,附加另一个 csv【英文标题】:Python/Numpy(CSV): Finding values, appending another csv 【发布时间】:2019-04-17 12:53:58 【问题描述】:

我发现了与此密切相关的其他帖子,但它们没有帮助。

我有一个 Master CSV 文件,我需要从第二列中找到特定的“字符串”。如下图:

Name,ID,Title,Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
Joshua Morales,MF6B9X,Tech_Rep, 08-Nov-2016,948,740,8,8
Betty García,ERTW77,SME, 08-Nov-2016,965,854,15,12
Kathleen Marrero,KTD684,Probation, 08-Nov-2016,946,948,na,na
Mark León,GSL89D,Tech_Rep, 08-Nov-2016,951,844,6,4

ID 列是唯一的,因此我试图找到“KTD684”(例如)。找到后,我需要导出“Date”、“Prj1_Assigned”、“Prj1_closed”、“Prj2_assigned”和“Prj2_solved”的值。

导出到文件 'KTD684.csv'(与 ID 相同),其中已经有可用的标题 'Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved'

到目前为止(因为我是一名非程序员)我还不能起草这个,但是请您指导我:

    查找包含元素“KTD684”的行。 从该行中选择以下值: ['日期,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved'] 请附加带有 ID 名称的文件('KTD684.csv')

我需要为 45 个用户 ID 执行此操作,现在在公司招聘,它是 195。我尝试编写 excel 宏(也没有工作),但我觉得 python 最可靠。

我知道我至少需要展示基本的进展,但是在尝试向某人学习 2 个多月后,我仍然无法在这个 csv 中找到元素。

【问题讨论】:

因此,对于 ID = KTD684,您想将“Mark León,GSL89D,Tech_Rep, 08-Nov-2016,951,844,6,4”写入名为“KTD684.csv”的文件中,这样是否正确? 亲爱的乔纳森,是的,请,我需要与特定 ID 相关的数据:2016 年 11 月 8 日,951,844,6,4 【参考方案1】:

这是pandas 的理想用例:

import pandas as pd

id_list = ['KTD684']

df = pd.read_csv('input.csv')
# Only keep values that are in 'id_list'
df = df[df['ID'].isin(id_list)]

gb = df.groupby('ID')
for name, group in gb:
    with open('.csv'.format(name), 'a') as f:
        group.to_csv(f, header=False, index=False,
                     columns=["Date", "Prj1_Assigned", "Prj1_closed",
                             "Prj2_assigned", "Prj2_solved"])

这将打开 CSV,仅选择列表中的行 (id_list),按 ID 列中的值分组,并为每个唯一的 ID 保存单独的 CSV 文件。您只需扩展 id_list 即可获得您感兴趣的 id。


扩展示例:

读取 CSV 会生成如下所示的 DataFrame 对象:

df = pd.read_csv('input.csv')
               Name      ID      Title          Date  Prj1_Assigned  \
0    Joshua Morales  MF6B9X   Tech_Rep   08-Nov-2016            948
1      Betty García  ERTW77        SME   08-Nov-2016            965
2  Kathleen Marrero  KTD684  Probation   08-Nov-2016            946
3         Mark León  GSL89D   Tech_Rep   08-Nov-2016            951

   Prj1_closed Prj2_assigned Prj2_solved
0          740             8           8
1          854            15          12
2          948            na          na
3          844             6           4

如果你只选择KTD684GSL89D

id_list = ['KTD684', 'GSL89D']
df = df[df['ID'].isin(id_list)]
               Name      ID      Title          Date  Prj1_Assigned  \
2  Kathleen Marrero  KTD684  Probation   08-Nov-2016            946
3         Mark León  GSL89D   Tech_Rep   08-Nov-2016            951

   Prj1_closed Prj2_assigned Prj2_solved
2          948            na          na
3          844             6           4

ID 上的 groupby 操作组并将每个唯一 ID 导出到 CSV 文件,结果:

KTD684.csv
Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
08-Nov-2016,946,948,na,na

GSL89D.csv
Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
08-Nov-2016,951,844,6,4

【讨论】:

亲爱的亚历克斯,非常感谢您提供您对此的看法。我发现以下错误请文件“”,第 4 行 header=[“Date”, "Prj1_Assigned", "Prj1_closed", ^ SyntaxError: 关键字参数重复[这可能是小问题,甚至可能是我的错误,但我一直在努力解决这个问题] 我已经更新了答案,我不小心重复了一个参数。 非常感谢 Alex...它真的很好用... :) :) :) 我很高兴它成功了,请查看pandas docs 以了解您可以使用该库做什么。如果您遇到困难,可以通过pandas tag 询问。【参考方案2】:

如果我正确理解您的问题;您需要从 2 个输入文件中读取:

1 包含您要查找的用户 ID

2包含与用户相关的项目数据

以这种方式,这样的事情会在文件 2 中找到您在 1 中指定的所有用户,并将它们写到 result.csv

在 search_for.csv 中详细说明您的搜索 ID。请记住,这 每次运行时都会重写你的 result.csv。

import csv
import sys
import os


inputPatterns = open(os.curdir + '/search_for.csv', 'rt')

# Reader for the IDs (users) you are looking to find (key)
reader = csv.reader(inputPatterns)

ids = []

# reading the IDs you are looking for from search_for.csv
for row in reader:
    ids.append(row[0])
inputPatterns.close()

# Let's see if any of the user IDs we are looking for has any project related info
# if so write them to your output CSV
for userID in ids:
    # Organization list with names and Company ID and reader
    userList = open(os.curdir + '/users.csv', 'rt')
    reader = csv.reader(userList)

    # This will be the output file
    result_f = open(os.curdir + "/" + userID + ".csv", 'w')
    w = csv.writer(result_f)
    # Writing header information
    w.writerow(['Date', 'Prj1_Assigned', 'Prj1_closed', 'Prj2_assigned', 'Prj2_solved'])

    # Scanning for projects for user and appending them
    for row in reader:
        if userID == row[1]:
            w.writerow([row[3], row[4], row[5], row[6], row[7]])
    result_f.close()
    userList.close()

例如,search_for.csv 看起来像这样

【讨论】:

亲爱的 Gabor,非常感谢您为此提供解决方案。但是当我执行代码时,这会给我输出文件,其中包含您提到的用户名。实际上希望它是 ID 名称(.csv),此外,输出的 csv 文件中只有标题,但没有与它们相关的数据 MF6B9X,Tech_Rep, 08-Nov-2016,948,740, 8,8 ...请帮助我完成以下步骤:[1]打开主文件(Trials.csv) - [2]找到“KTD684”可用的确切列 - [3]附加(已经存在 KTD684.csv,其中包含来自 Date... 的 5 个值,请在下一个可用行中 嗨 Lokkii,是的,我在第一个版本中误解了你的问题。此版本是在您发表评论之前上传的,应该完全符合您的要求。我也是 *** 的新手,所以我不知道我需要在更新时通知你 :) 但只是为了澄清。如果您使用输入文件:search_for.csvusers.csv(而不是 Trials.csv)与此 python 文件位于同一目录中。它应该按需要工作;创建 useID.csv 文件。我看到您已经接受了答案,因此问题已解决。注意:这个问题在excel数据透视表中可以很快解决。 嗨,Gabor :) 非常感谢这个......它确实工作得很好...... :) 感谢你的时间!【参考方案3】:

这是一个纯 Python 方法,它使用 csv.DictReader 读取主文件 .csv,匹配 id,并将文件数据附加到新的或现有的 .csv 文件中,使用 csv.DictWriter()

from csv import DictReader
from csv import DictWriter

from os.path import isfile

def export_csv(user_id, master_csv, fieldnames, key_id, extension=".csv"):
    filename = user_id + extension
    file_exists = isfile(filename)

    with open(file=master_csv) as in_file, open(
        file=filename, mode="a", newline=""
    ) as out_file:

        # Create reading and writing objects
        csv_reader = DictReader(in_file)
        csv_writer = DictWriter(out_file, fieldnames=fieldnames)

        # Only write header once
        if not file_exists:
            csv_writer.writeheader()

        # Go through lines and match ids
        for line in csv_reader:
            if line[key_id] == user_id:

                 # Modify line and append to file
                line = k: v.strip() for k, v in line.items() if k in fieldnames
                csv_writer.writerow(line)

可以这样调用:

export_csv(
    user_id="KTD684",
    master_csv="master.csv",
    fieldnames=["Date", "Prj1_Assigned", "Prj1_closed", "Prj2_assigned", "Prj2_solved"],
    key_id="ID",
)

并产生以下KTD684.csv

Date,Prj1_Assigned,Prj1_closed,Prj2_assigned,Prj2_solved
08-Nov-2016,946,948,na,na

【讨论】:

亲爱的 RoadRunner,非常感谢您抽出宝贵的时间来解决这个问题。请在我执行此操作时发现似乎即将出现的错误。 **TypeError Traceback(最近一次调用最后) in () 3 master_csv="master.csv", 4 columns=["Date", "Prj1_Assigned", "Prj1_closed", "Prj2_assigned", "Prj2_solved"], ----> 5 key_id="ID", 6 ) TypeError: export_csv() got an unexpected keyword argument 'columns' ** 请问有什么办法解决这个问题..跨度> 非常感谢这位 RoadRunner...抱歉回复晚了... :) :) :)

以上是关于Python/Numpy(CSV):查找值,附加另一个 csv的主要内容,如果未能解决你的问题,请参考以下文章

Python Numpy:用另一个数组中的对应值替换一个数组中的值

将数据文件附加到 CSV 文件并输出到另一个 CSV 文件

使用 Python/numpy 过滤 CSV 数据

使用 Python/numpy 过滤 CSV 数据

在 Python 中将行从一个 CSV 附加到另一个

将缺失值附加到 CSV 文件