1

我有一个 .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/流行):

['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/Pop 并将其附加到“thisthing”

我不知道从哪里开始这样做,而且我已经被困在这里大约一个星期了......任何帮助将不胜感激。

4

2 回答 2

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
于 2013-05-29T09:42:36.827 回答
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'。但是,显示我们跳过第一行的意图仍然是一种很好的做法。因为我们都知道:显式优于隐式。

我们使用 adefaultdict 来避免在一年的第一次插入时进行测试:

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')])

编辑2

如果按照 OP 的要求缺少年份,则进行小的修改:

list_data = []
for key, value in data.items():
    list_data.append([key] + [value.get(year, 0) for year in ('2002', '2005')])

0如果缺少年份,这会输入。使用任何合适的其他值来指示缺失值。

编辑3

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])
于 2013-05-29T10:16:06.537 回答