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
如果你只选择KTD684
和GSL89D
:
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
【讨论】:
亲爱的亚历克斯,非常感谢您提供您对此的看法。我发现以下错误请文件“如果我正确理解您的问题;您需要从 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.csv 和 users.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(最近一次调用最后)以上是关于Python/Numpy(CSV):查找值,附加另一个 csv的主要内容,如果未能解决你的问题,请参考以下文章