0

我有以下代码,我从 csv 文件中读取数据,然后操作其中的一些数据,我想将修改后的数据放入数据框中。我正在考虑将它添加到字典中,但我不确定我应该如何真正做到这一点。

我使用以下 CSV 数据文件作为数据源:

"17",20.2147418139502,20,20,20.8652568117822
"6",19.9412500131875,13,19,20.4982216893409
"4",16.3402085164562,6,18,16.729284141648
"11",15.9562389152125,11,17,16.4769352577916
"19",13.2889788383618,12,16,13.8285694613856
"15",11.7133173411712,1,15,11.7133173411712

我忽略了 csv 数据集中的第一列。

重新计算后,我的数据是这样的(看下面的代码来理解数据操作):

15.9562389152125    11  12.0    16.4769352577916    16.4958295382
13.2889788383618    12  13.0    13.8285694613856    13.8459505145
11.7133173411712    1   2.0 11.7133173411712    11.863832339
9.68207331560552    14  15.0    10.2551373334446    10.2701189451
9.56895540188998    19  20.0    10.2083322023664    10.2194703997
7.30124705657363    2   3.0 7.45176205440562    7.53980768393
6.83169608190656    5   6.0 7.18118108407457    7.2207717071
6.40446470770985    4   5.0 6.70549470337383    6.75394970988

然后我按第 4 列、第 3 列和第 5 列反向排序。

然后我根据第 5 列在末尾添加一个排名列,如下所示。

15.9562389152125    11  12.0    16.4769352577916    16.4958295382    1
13.2889788383618    12  13.0    13.8285694613856    13.8459505145    2 
11.7133173411712    1   2.0 11.7133173411712    11.863832339     3 
9.68207331560552    14  15.0    10.2551373334446    10.2701189451    4
9.56895540188998    19  20.0    10.2083322023664    10.2194703997    5
7.30124705657363    2   3.0 7.45176205440562    7.53980768393    6
6.83169608190656    5   6.0 7.18118108407457    7.2207717071     7
6.40446470770985    4   5.0 6.70549470337383    6.75394970988    8

我不确定要使用哪种数据结构来实现这一点。

我尝试了以下代码:

def increaseQuantityByOne(self, fileLocation):
    rows = csv.reader(open(fileLocation))
    rows.next()
    print "PricePercentage\t" + "OldQuantity\t" + "newQuantity\t" + "oldCompScore\t" + "newCompScore"
    priceCompValue = []
    priceCompRank = []
    newPriceCompValue = []
    newPriceCompRank = []
    for row in rows:
        newQuantity = float(row[2]) + 1.0
        newCompetitiveScore = float(row[1]) + float(math.log(float(newQuantity), 100))
        print row[1] + "\t", str(row[2])+"\t", str(newQuantity) + "\t", str(row[4]) + "\t", newCompetitiveScore
        priceCompValue.append(float(row[4]))
        priceCompRank.append(int(row[3]))
        newPriceCompValue.append(newCompetitiveScore)
    priceCompValue.sort(reverse=True)
    priceCompRank.sort(reverse=True)
    newPriceCompValue.sort(reverse=True)
    for item in priceCompValue:
        print item
    for item in priceCompRank:
        print item
    for item in newPriceCompValue:
        print item
4

2 回答 2

1

不确定我是否理解您想要做什么,但我对所有表格和排序类型的东西都使用 python numpy。

http://www.scipy.org/Tentative_NumPy_Tutorial http://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html#numpy.lexsort

基根

于 2012-06-18T19:15:10.740 回答
1

假设您的数据位于data.csv与此脚本位于同一目录中的 csv 文件(称为 )中:

from pprint import pprint
import math
import csv

# function to massage each row into desired values
def calc_new_vals(row):
    newQuantity = float(row[2]) + 1.0
    newCompetitiveScore = float(row[1]) + math.log(newQuantity, 100)
    return [ float(row[1]), 
             float(row[2]), 
             newQuantity, 
             float(row[4]), 
             newCompetitiveScore ]

# read data from file and recalculate each row
f = open('./data.csv', 'r')
reader = csv.reader(f)
records = [ calc_new_vals(record) for record in reader ]

# This sorts by the three columns in reverse
# see this page for more: http://wiki.python.org/moin/HowTo/Sorting/
records = sorted(records, key=lambda record: record[3], reverse = True)
records = sorted(records, key=lambda record: record[2], reverse = True)
records = sorted(records, key=lambda record: record[4], reverse = True)

new_records = []
rank = 1
for row in records:
    row.append( rank )
    new_records.append( row )
    rank += 1
pprint(new_records)

这会产生一个列表列表:

[[20.2147418139502, 20.0, 21.0, 20.8652568117822, 20.87585146131716, 1],
 [19.9412500131875, 13.0, 14.0, 20.4982216893409, 20.51431403102662, 2],
 [16.3402085164562, 6.0, 7.0, 16.729284141648, 16.76275753646333, 3],
 [15.9562389152125, 11.0, 12.0, 16.4769352577916, 16.49582953823631, 4],
 [13.2889788383618, 12.0, 13.0, 13.8285694613856, 13.845950514515218, 5],
 [11.7133173411712, 1.0, 2.0, 11.7133173411712, 11.86383233900319, 6]]

我希望这能让你开始。

于 2012-06-18T19:43:23.260 回答