我有一个.csv文件如下(摘录)。
Country,Year,GDP ($US),Population
Angola,2002,11431738368,10760510
Angola,2005,32810672128,11706954
Antigua and Barbuda,2002,714677760,67448
Antigua and Barbuda,2005,875751360,68722
Argentina,2002,1.02E+11,38331121
Argentina,2005,1.83E+11,39537943
Armenia,2002,2376335104,3013818
Armenia,2005,4902779392,2982904
...
我需要找到2002年五个最低的GDP / Pop国家,然后在2005年找到相应的GDP / Pop值,然后计算差异和百分比差异。对于某些记录,GDP或人口值都有空白,我省略了。
到目前为止我用过
import csv
import operator
data = open('file.csv')
read_data = csv.reader(data)
thisthing = []
for line in read_data:
#find 2002 GDP/Pop, omit blanks, append to list
if line[7] == '2002' and line[8] != ' ' and line[9] != ' ':
thisthing.append([line[0], (float(line[8])/(int(line[9])))])
thisthing.sort(key=operator.itemgetter(1))
这会产生一个逐行打印的列表(国家,GDP / Pop):
['Burma (Myanmar)', 69.07171351277908]
['Burundi', 89.45864552423431]
['Congo (Dem. Rep.)', 99.23033109735835]
['Ethiopia', 109.33326343550823]
['Eritrea', 142.8576737907048]
['Guinea-Bissau', 151.110429668747]
['Afghanistan', 159.7524117568956]
['Malawi', 159.7614709537829]
['Sierra Leone', 174.6506490278577]
我想现在迭代回来'read_data',使用'thisthing'中的国家/地区名称作为条件以及我的空白预防条件
and line[8] != ' ' and line[9] != ' ':
选择并追加2005年GDP /流行音乐''thisthing'
我不知道从哪里开始这样做,而且我已经被困在这里大约一个星期......任何帮助都会非常感激。
答案 0 :(得分:0)
试试这个!!
import csv
import operator
data = open('file.csv') read_data = csv.reader(data)
data_2002 = {}
data_2005 = {}
thisthing = [["country", "2002%", "2005%"]]
for line in read_data:
try:
gdp = float(line[8])/(int(line[9]))
if line[7] == '2002' and line[8] != ' ' and line[9] != ' ':
data_2002[line[0]] = gdp
elif line[7] == '2005' and line[8] != ' ' and line[9] != ' ':
data_2002[line[0]] = gdp
except KeyError:
print line[0]
continue
for country in data_2002:
thisthing.append([country, data_2002[country], data_2005[country]])
print thisthing
答案 1 :(得分:0)
将其用作read_data
:
[['Country', 'Year', 'GDP ($US)', 'Population'],
['Angola', '2002', '11431738368', '10760510'],
['Angola', '2005', '32810672128', '11706954'],
['Antigua and Barbuda', '2002', '714677760', '67448'],
['Antigua and Barbuda', '2005', '875751360', '68722'],
['Argentina', '2002', '1.02E+11', '38331121'],
['Argentina', '2005', '1.83E+11', '39537943'],
['Armenia', '2002', '2376335104', '3013818'],
['Armenia', '2005', '4902779392', '2982904']]
我们不想要第一行:
read_data = read_data[1:]
如果csv.read
使用read_data
对象,请执行:
next(read_data)
实际上,代码足够强大,可以迭代所有行
因为我们跳过了由转换字符串引起的异常行
到一个不起作用的数字,即'GDP ($US)'
和'Population'
。
但是,显示我们跳过第一行的意图仍然是一个好习惯。
因为我们都知道:明确比隐含更好。
我们使用defaultdict
来避免在第一年插入时进行测试:
import collections
data = collections.defaultdict(dict)
for line in read_data:
try:
gdp = float(line[2]) / float(line[3])
# Make sure this exception catches what you want.
except (ValueError, ZeroDivisionError):
continue
data[line[0]][line[1]] = gdp
现在我们为data
获取此内容:
{'Angola': {'2002': 1062.3788619684383, '2005': 2802.6651619200006},
'Antigua and Barbuda': {'2002': 10595.981496856837,
'2005': 12743.391635866245},
'Argentina': {'2002': 2661.023140961622, '2005': 4628.465370593508},
'Armenia': {'2002': 788.4799626254804, '2005': 1643.6262756025671}}
我们需要重新排列才能进入您的列表:
list_data = []
for key, value in data.items():
list_data.append([key] + [value[year] for year in sorted(value.keys())])
结果:
[['Antigua and Barbuda', 10595.981496856837, 12743.391635866245],
['Argentina', 2661.023140961622, 4628.465370593508],
['Angola', 1062.3788619684383, 2802.6651619200006],
['Armenia', 788.4799626254804, 1643.6262756025671]]
此解决方案可以使用多年,并按时间顺序排列。
修改强>
事实证明,这些数据包含了两年多的时间。我不想要这么多年。将最后一部分更改为仅包含您明确需要的年份:
list_data = []
for key, value in data.items():
list_data.append([key] + [value[year] for year in ('2002', '2005')])
<强> EDIT2 强>
如果OP要求缺少年份,则进行小幅修改:
list_data = []
for key, value in data.items():
list_data.append([key] + [value.get(year, 0) for year in ('2002', '2005')])
如果缺少年份,则输入0
。使用任何合适的其他值来表示缺失值。
<强> EDIT3 强>
OP要求的另一种变体。如果没有值,则不附加:
list_data = []
for key, value in data.items():
list_data.append([key] + [value.get(year) for year in ('2002', '2005')
if value.get(year) is not None])