【发布时间】: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
【问题讨论】:
-
如果是个人项目我强烈建议你使用
pandas。read_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 个条目。