【发布时间】:2020-02-26 02:34:42
【问题描述】:
我有一个 csv 文件,看起来像这样
year,gender,age,country
2002,F,9-10,CO
2002,F,9-10,CO
2002,M,9-10,CO
2002,F,9-10,BR
2002,M,11-15,BR
2002,F,11-15,CO
2003,F,9-10,CO
2003,M,9-10,CO
2003,F,9-10,BR
2003,M,9-10,CO
2004,F,11-15,BR
2004,F,11-15,CO
2004,F,9-10,BR
2004,F,9-10,CO
我想得到这样的输出文件:
year,gender,age,country,population
2002,F,9-10,CO,2
2002,M,9-10,CO,1
2002,F,9-10,BR,1
2002,M,9-10,BR,0
2002,F,11-15,CO,1
2002,M,11-15,CO,0
2002,F,11-15,BR,0
2002,M,11-15,BR,1
2003,F,9-10,CO,1
2003,M,9-10,CO,1
2003,F,9-10,BR,1
2003,M,9-10,BR,0
2003,F,11-15,CO,0
2003,M,11-15,CO,0
2004,F,9-10,CO,1
2004,M,9-10,CO,0
2004,F,9-10,BR,1
2004,M,9-10,BR,0
2004,F,11-15,CO,1
2004,M,11-15,CO,0
2004,F,11-15,BR,1
2004,M,11-15,BR,0
基本上我想打印出每年、每个年龄和每个国家的女性人数,所以年份、性别、年龄和国家将是字典的键。此外,有些年份没有特定国家的数据,或者有些年份没有特定国家的特定年龄。例如,2003 年,CO 国没有 11-15 岁年龄段的女性数据。在这种情况下,人口将为 0。而且,有些年份根本没有特定的性别数据。例如,对于 2004 年,没有所有年龄和国家的男性数据,但我仍然想在人口 0 的输出文件中打印出来。
以下是我编写的一些python代码,但它不起作用,我不知道如何处理丢失的数据并在人口字段中将其打印为0。
import csv
import os
import sys
from operator import itemgetter, attrgetter
import math
from collections import Counter
# Create dictionary to hold the data
valDic = {}
# Read data into dictionary
with open(sys.argv[1], "r",) as inputfile:
readcsv = csv.reader(inputfile, delimiter = ',')
next(readcsv)
for line in readcsv:
key = line[0] + line[1] + line[2] + line[3]
year = line[0]
gender = line[1]
age = line[2]
country = line[3]
if key in valDic:
key = key + 1
else:
valDic[key] = [year, gender, age, country, 0] # 0s are placeholder for running sum and itemCount
inputfile.close()
newcsvfile = []
for key in valDic:
newcsvfile.append([valDic[key][0], valDic[key][1], valDic[key][2], valDic[key][3], len(valDic[key])])
newcsvfile = sorted(newcsvfile)
newcsvfile = [["year", "gender", "age", "country", "population"]]
with open(sys.argv[2], "w") as outputfile:
writer = csv.writer(outputfile)
writer.writerows(newcsvfile)
【问题讨论】:
-
使用
df.groupby(['year', 'genter', 'age', 'country'])你可以数数 -
您可以在开始时创建所有键和值都为 0 的字典。如果某些键在 csv 中不存在,那么您的字典中将为 0。
-
@furas 你能更具体一点吗?在真实文件中有超过 2 个国家和年龄,我无法全部列出。我是编码新手,所以我不知道如何像你说的那样用所有键创建一个 dic
-
要获得 0 的缺失值,您必须首先创建包含所有国家/地区、所有年龄范围的列表。使用这些列表,您可以在填写字典后检查字典中是否缺少数据。或者在开始时,您可以创建所有项目都填充为零的字典,然后从 csv 添加值。因此,您必须先读取 csv 才能获取所有国家和所有年龄范围,然后再读取 csv 以创建字典。
标签: python pandas numpy data-cleaning