我有一堆带有数据的csv文件(不是数据库文件)。假设有两个csv文件-Candidate.csv和application.csv
鉴于候选人的电子邮件,我需要从这两个csv中提取相关信息并将其提取到单独的csv文件中。
逻辑- 已给定=候选人的电子邮件地址
在候选人.csv上运行查询-从电子邮件='blah@example.com'的候选人中选择*
将结果转储到Candidate-filtered.csv
使用检索到的候选记录的“ Id”列,在application.csv上运行查询
从应用程序中选择*,其中applicationId ='id从先前的查询结果中检索出来'
将结果转储到application-filtered.csv
我需要帮助将结果转储到那些经过过滤的csv中(包括原始csv的列标题,因此任何查看经过过滤的csv的人都知道哪一列引用了哪些数据)
我认为我可以使用SQLITE将csv文件加载到内存表中并对其执行查询(甚至将结果导出到单独的csv文件中。现在SQLITE拥有一种简洁的方法:
.mode csv
.import 'Candidate.csv candidates'
.headers on
.output 'Candidate-filtered.csv'
Select * from candidates where Email='blah@example.com'
但是,我想使用Python做到这一点,因为我将必须存储每个结果中的变量(例如检索到的候选ID),并在下一个查询(用于应用程序的查询)中使用它们。
现在,我想尝试一下可以在Candidates.csv上运行的代码。
这是我拥有的Python代码:
import sqlite3
import pandas
def extract_Candidate():
conn = sqlite3.connect(':memory:')
data = pandas.read_csv('Candidate.csv')
data.to_sql('candidates',conn)
cur = conn.cursor()
cur.execute("Select * from candidates where Email='blah@example.com'")
rows = cur.fetchall()
conn.close()
return rows
candidateRows = extract_Candidate()
print(candidateRows)
我真的不需要返回候选人变量。只要我可以将结果转储到csv中,就可以了。我可以在终端中打印检索到的行。我不知道如何将其转储到新的csv文件中(我需要原始csv文件中存在的所有列标题)。
大多数搜索引擎结果都显示了如何将内存数据库导出到磁盘。我不要.db文件。我只想将查询结果导出到csv文件中。我看到了一些csv导出代码,但是它们是对列标题进行硬编码的。我希望它采用原始csv中的任何列标题,而无需我进行任何硬编码。
下一步是从所有检索到的候选对象中获取“ Id”列,并以某种数组或集合形式返回它们。我知道这是基本的Python,但对python(或sqlite)一无所知。
也可以随意批评代码(我仍然担心pandas.read_csv是否可以处理巨大的csv文件;让我知道您的想法)。
答案 0 :(得分:1)
您会接受一个适用于纯熊猫的解决方案,而不是增加sql复杂性吗?关于熊猫大小限制的问题,通常唯一的限制是您的可用系统内存,这也是SQL解决方案的限制。
请注意,以下解决方案未经测试和理论上的限制,因为我们没有任何要测试的样本数据。
import pandas as pd
#we bring in the data
candidates_df = pd.read_csv('Candidate.csv')
app_df = pd.read_csv('Applications.csv')
#we set the search email
candidate_email = 'blah@example.com'
#we use pandas boolean masking to filter the dataframe and get just the 'id' column
filtered_ids = candidates_df[candidates_df['email']==candidate_email]['id']
#we use the pandas series of ids to filter the applications
filtered_apps = app_df[app_df['id'].isin(filtered_ids)]
#we dump the filtered apps df to a new csv file
filtered_apps.to_csv('directory/file_out.csv')