我有一系列包含50多个字段的大型csv文件的列标题名称。在文件中,我需要的列索引并不总是相同。
我已经编写了代码,可以找到每个文件中列的索引号。现在,我只想将此列添加为字典中的键,该字典中的值将计算该列中唯一字符串的数量。
由于这些csv文件很大,并且我正在尝试使用最佳实践进行有效的数据工程,因此我正在寻找一种使用最少内存的解决方案。我找到的将csv写入字典的所有解决方案都涉及将csv中的所有数据写入字典,我认为这不是必需的。最好的解决方案似乎只涉及从这一列中读取数据,并将此列添加到字典键中。
因此,我们将其作为示例数据:
FOODS;CALS
"PIZZA";600
"PIZZA";600
"BURGERS";500
"PIZZA";600
"PASTA";400
"PIZZA";600
"SALAD";100
"CHICKEN WINGS";300
"PIZZA";600
"PIZZA";600
我想要的结果
food_dict = {'PIZZA': 6, 'PASTA': 1, 'BURGERS': 1, 'SALAD': 1, 'CHICKEN WINGS': 1}
现在让我们说我只需要FOODS列中的数据,在这种情况下,我将索引值设置为变量food_index。
这是我尝试过的问题,问题在于列在不同文件中并不总是位于相同的索引位置,因此此解决方案将不起作用:
from itertools import islice
with open(input_data_txt, "r") as file:
# This enables skipping the header line.
skipped = islice(file, 1, None)
for i, line in enumerate(skipped, 2):
try:
food, cals = line.split(";")
except ValueError:
pass
food_dict = {}
if food not in food_dict:
food_dict[food] = 1
else:
food_dict[food] += 1
此解决方案仅适用于此示例-但前提是我提前知道列的位置-再次提醒我,我有50列以上的列,而我需要的列的索引位置有所不同跨文件。
是否可以这样做?同样,仅内置-没有Pandas或Numpy或其他类似程序包。
答案 0 :(得分:0)
from collections import Counter
import csv
with open(filename) as f:
reader = csv.reader(f)
next(reader, None) # skips header
histogram = Counter(line[0] for line in reader)
答案 1 :(得分:0)
这里重要的部分是您不要跳过标题行!您需要split
的那一行并找到所需列的索引!由于您知道所需信息的列标题,因此将其放入参考列表中:
wanted_headers = ["FOODS", "RECYCLING"]
with open(input_data_txt, "r") as infile:
header = infile.read().split(';')
wanted_cols = [header.index(label) for label in wanted_headers if label in header]
# wanted_cols is now a list of column numbers you want
for line in infile.readlines(): # Iterate through remaining file
fields = line.split(';')
data = [fields[col] for col in wanted_cols]
现在,数据的顺序与现有标头的顺序相同;您可以根据需要进行匹配或重新排列。
能解决您的障碍吗?我为您留出了很多实施方案...