0

Python 业余爱好者在这里......假设在这里我有一个示例 csv 文件的片段:

Country, Year, GDP, Population
Country1,2002,44545,24352
Country2,2004,14325,75677
Country3,2005,23132412,1345234
Country4,,2312421,12412

我需要按某年(例如 2002 年)的人均 GDP(GDP/人口)降序对文件进行排序,然后获取人均 GDP 值最大的前 10 行。

到目前为止,在我将 csv 导入“数据”变量后,我使用以下方法获取了所有 2002 年的数据而不会丢失字段:

data_2 = []
for row in data:
if row[1] == '2002' and row[2]!= ' ' and row[3] != ' ':
    data_2.append(row)

我需要找到某种data_2row[2]/row[3]降序排序的方法,最好不使用类,然后抓取与最大 10 个值中的每一个相关的每一整行,然后写入另一个 csv。如果有人能指出我正确的方向,我将永远感激不尽,因为我已经尝试了无数的谷歌......

4

3 回答 3

3

这种方法可以让您对文件进行一次扫描,以获得每个国家/地区的前 10 名...

pandas不使用模块也可以做到这一点heapq,以下内容未经测试,但应该是您参考适当文档并适应您的目的的基础:

import csv
import heapq
from itertools import islice

freqs = {}
with open('yourfile') as fin:
    csvin = csv.reader(fin)
    rows_with_gdp = ([float(row[2]) / float(row[3])] + row for row in islice(csvin, 1, None) if row[2] and row[3])
    for row in rows_with_gdp:
        cnt = freqs.setdefault(row[2], [[]] * 10) # 2 = year, 10 = num to keep
        heapq.heappushpop(cnt, row)

for year, vals in freqs.iteritems():
    print year, [row[1:] for row in sorted(filter(None, vals), reverse=True)]
于 2013-05-23T08:13:42.977 回答
2

相关模块将是:

  • 用于解析输入的csv
  • collections.namedtuple为字段命名
  • filter()函数提取指定的年份范围
  • heapq.nlargest()找到最大值
  • pprint.pprint()以获得良好的输出

这里有一点可以让你开始(我会做所有的事情,但是有人编写你的整个程序并剥夺你完成它的乐趣有什么乐趣):

from __future__ import division
import csv, collections, heapq, pprint

filecontents = '''\
Country, Year, GDP, Population
Country1,2002,44545,24352
Country2,2004,14325,75677
Country3,2004,23132412,1345234
Country4,2004,2312421,12412
'''

CountryStats = collections.namedtuple('CountryStats', ['country', 'year', 'gdp', 'population'])
dialect = csv.Sniffer().sniff(filecontents)

data = []
for country, year, gdp, pop in csv.reader(filecontents.splitlines()[1:], dialect):
    row = CountryStats(country, int(year), int(gdp), int(pop))
    if row.year == 2004:
        data.append(row)

data.sort(key = lambda s: s.gdp / s.population)
pprint.pprint(data)
于 2013-05-23T07:43:44.020 回答
0

使用排序函数的可选键参数:

array.sort(key=lambda x: x[2])

array将使用其第三个元素作为键进行排序。key 参数的值应该是一个 lambda 表达式,它接受单个参数(正在排序的数组的任意元素)并返回用于排序的键。

对于您的 GDP 示例,要使用的 lambda 函数为:

lambda x: float(x[2])/float(x[3]) # x[2] is GDP, x[3] is population

float函数将 CSV 字段从字符串转换为浮点数。由于无法保证这会成功(格式不正确、数据错误等),我通常会在排序之前执行此操作,将内容插入数组时。您应该在这里明确使用浮点除法,因为整数除法不会给您预期的结果。如果您发现自己经常这样做,则可以选择更改除法运算符的行为(http://www.python.org/dev/peps/pep-0238/和相关链接)。

于 2013-05-23T06:42:05.523 回答