【问题标题】:Correlate data from two CSVs and write the data to the first CSV using Python关联来自两个 CSV 的数据并使用 Python 将数据写入第一个 CSV
【发布时间】:2023-04-10 10:01:01
【问题描述】:

我不知道从哪里开始研究这个个人项目,我希望这个社区可以帮助我创建一个 Python 脚本来处理这些数据。

我有一个 CSV 文件,其中包含在动物救援中喂给狗的食物列表,并与狗窝编号相关联:

源 CSV - mealandtreats.csv

blank_column,Kennel_Number,Species,Food,Meal_ID
,1,Dog,Meal,11.2
,5,Dog,Meal,45.2
,3,Dog,Meal,21.4
,4,Dog,Meal,17
,2,Dog,Meal,11.2
,4,Dog,Meal,21.4
,6,Dog,Meal,17
,2,Dog,Meal,45.2

我有第二个 CSV 文件,它提供了一个键,用于将餐食与餐食搭配:

Meal to Treat Key - MealsToTreatsKey.csv

Meals_fed,Treats_fed
10.1,2.4
11.2,2.4
13.5,3
15.6,3.2
17,3.2
20.1,5.1
21.4,5.2
35.7,7.7
45.2,7.9

我需要获取表 1 中提供的每种餐食类型(例如,删除重复条目),找到相关的零食类型,然后为每次向特定狗舍提供零食时创建一个单独的条目。最终结果应该是这样的:

结果 CSV - mealandtreats.csv

blank_column,Kennel_Number,Species,Food,Meal_ID
,1,Dog,Meal,11.2
,5,Dog,Meal,45.2
,3,Dog,Meal,21.4
,4,Dog,Meal,17
,2,Dog,Meal,11.2
,4,Dog,Meal,21.4
,6,Dog,Meal,17
,2,Dog,Meal,45.2
,1,Dog,Treat,2.4
,5,Dog,Treat,7.9
,3,Dog,Treat,5.2
,4,Dog,Treat,3.2
,1,Dog,Treat,2.4
,4,Dog,Treat,5.2

我更愿意使用 csv 模块而不是 Pandas,但我愿意在必要时使用 Pandas。

到目前为止,我有一些代码只是打开 CSV,但我真的不知道下一步该去哪里:

import csv

with open('./meals/results/foodToTreats.csv', 'r') as t1, 
open('./results/food.csv', 'r') as t2:
    key = t1.readlines()
    map = t2.readlines()

with open('./results/food.csv', 'w') as outFileF:
        for line in map:
            if line not in key:
                outFileF.write(line)

with open('./results/foodandtreats.csv', 'w') as outFileFT:
        for line in map:
            if line not in key:
                outFileFT.write(line)

所以基本上我只需要获取第二张表中的每个零食条目,在第一张表中搜索匹配的相关食品条目,查找与该条目相关的犬舍编号,然后将其写入第一张表。

用伪代码尽力而为,例如:

for x in column 0,y: 
    y,1 = Z 

food = x
treat = y
kennel_number = z

when x,z: 
    writerows('', {'kennel_number"}, 'species', '{food/treat}',  
{'meal_id"})

更新:感谢@wwii,这是我正在使用的确切代码。看到一个小错误:

import csv
import collections

treats = {}
with open('mealsToTreatsKey.csv') as f2:
    for line in f2:
        meal,treat = line.strip().split(',')
        treats[meal] = treat

new_items = set()
Treat = collections.namedtuple('Treat', ['blank_column','Kennel_Number','Species','Food','Meal_ID'])

with open('foodandtreats.csv') as f1:
    reader = csv.DictReader(f1)
    for row in reader:
        row['Food'] = 'Treat'
        row['Meal_ID'] = treats[row['Meal_ID']]
        new_items.add(Treat(**row))
    fieldnames = reader.fieldnames

with open('foodandtreats.csv', 'a') as f1:
    writer = csv.DictWriter(f1, fieldnames)
    for row in new_items:
        writer.writerow(row._asdict())

除了一个小错误之外,这非常有效。写入的第一个新行不是从它自己的行开始: enter image description here

【问题讨论】:

  • 如果是个人项目我强烈建议你使用pandasread_csv 需要 2 行,删除重复项需要 1 行,left join 需要 1 行
  • @user32185 好的,太棒了,你说服了我。关于良好文档的任何提示? :D
  • 我可以为您提供完整的答案。但请先用 pandas 打开文件(使用df = pd.read_csv('./meals/results/foodToTreats.csv'))并在此处发布df.to_dict()的输出
  • 您指的是哪些重复项?如果 Kennel one 得到 Meal 11.2 的三倍,应该有多少款待条目?
  • @wwii 如果狗窝 1 获得 11.2 餐 3 次,我只需要一个结果条目将款待 2.4 与狗窝 1 相关联。如果将餐 11.2 提供给狗窝 1、7 和 20,我需要结果为犬舍 1、7 和 20 处理 2.4 个条目。

标签: python database csv


【解决方案1】:

制作一个字典,将食物映射到零食

treats = {}
with open(treatfile) as f2:
    for line in f2:
        meal,treat = line.strip().split(',')
        treats[meal] = treat

遍历膳食文件并创建一组新条目。对新项目使用 namedtuples。

import collections
new_items = set()
Treat = collections.namedtuple('Treat', ['blank_column','Kennel_Number','Species','Food','Meal_ID'])

with open(mealfile) as f1:
    reader = csv.DictReader(f1)
    for row in reader:
        row['Food'] = 'Treat'
        row['Meal_ID'] = treats[row['Meal_ID']]
        new_items.add(Treat(**row))
    fieldnames = reader.fieldnames

(再次)打开膳食文件以添加和写入新条目

with open(mealfile, 'a') as f1:
    writer = csv.DictWriter(f1, fieldnames)
    for row in new_items:
        writer.writerow(row._asdict())

如果餐文件不以换行符结尾,您需要在写入新的treat 行之前添加一个。由于您可以控制文件,因此您应该确保它始终以空行结尾。

【讨论】:

  • 看起来我们走在了正确的轨道上。当我尝试运行此代码时,我收到错误 - Traceback(最近一次调用最后一次):文件“foodToTreatsMapper.py”,第 18 行,在 new_items.add(Treat(**row)) TypeError: __new__()得到了一个意外的关键字参数“blank_column”
  • 当我使用您的示例数据/文件执行我的解决方案时,我没有收到错误消息。看起来错误是说您正在尝试创建 Treat (namedtuple) 并且您传递给它一个无效的关键字。您是否像我在解决方案中所做的那样定义了命名元组?您在该定义中拼错了blank_column 吗?
  • 可以确认“使用您的示例数据/文件执行我没有收到错误”
  • @wwii 我继续使用我正在使用的代码更新了原始帖子。这几乎就是你发布的内容。你看到有什么错误吗?感谢您迄今为止的帮助!
  • @wwii 让它工作。我的 CSV 文件有问题。我在上面概述了最后一个小错误。否则,脚本似乎运行良好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2019-02-05
  • 1970-01-01
  • 2019-05-21
  • 2019-12-10
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多