我正在处理具有以下格式的CSV文件
ST 1 2 3 4
WA 10 10 5 2
OR 0 7 3 9
CA 11 5 4 12
AZ -999 0 0 11
第一行代表1-4天的#。我希望能够获取每个状态的数据,例如WA, 10, 10, 5, 2
并创建一个数组,其中只包含该行中已排序的数字。如果我省略第一个是WA的索引,我可以使用。
sorted(list, key=int)
这样做会给我一个列表[2,5,10,10]
。
我想做的是
将计算值与正确的状态字段组合在一起。例如,如果我想为WA的数组添加值3。
b.insert(list[4]), 3)
获取
[2,3,5,10,10]
所以我可以计算排名。 (注意:我无法使用scipy,所以我必须使用我已经想出的函数来计算排名。)
通过将状态和等级值写入新的csv来结束,例如。
ST Rank
WA 30
CA 26
OR 55
其中Rank是数组中给定值的等级。
我对python很新,所以任何帮助或指针都会非常感激。我也只能使用基本的python模块。(numpy,csv ....等)
更新代码:
with open(outputDir+"needy.csv", 'rb') as f:
first = {row[0]: sorted(row[1:], key=int) for row in list(csv.reader(f))}
for key, value in first.items():
if addn in first:
g= "yes"
print key, addn, g
#print d
else:
g= "no"
print key, addn, g
value.append(300)
value.append(22)
value = sorted(value, key=int)
print "State:", key, value
当我这样做时,我追加的值将被添加并且dict将被正确排序,但是当我将n定义为值时,它将不会是fund。以下示例。
{'WA': ['1', '1', '1', '2', '2', '2', '3', '4', '4', '4', '5', '5', '5', '5', '6', '6', '7', '7', '8', '8', '8', '8', '9', '10', '10', '10', '10', '11', '11'}
如果我先打印出来就会发生上述情况。 如果我使用for循环并将addn指定为11作为全局函数,我得到。
WA 11 no
State: WA ['1', '1', '1', '2', '2', '2', '3', '4', '4', '4', '5', '5', '5', '5', '6', '6', '7', '7', '8', '8', '8', '8', '9', '10', '10', '10', '10', '11', '11',..]
因为11是键的一部分,它应该返回是等等。
答案 0 :(得分:1)
您可以使用简单的命令和字典来整理数据:
fid = open('out.txt') # Just copy what you put in your question inside a file.
l = fid.readlines() # Read the whole file into a list.
d = {} # create a dictionary.
for i in l:
s = i.split() # split the list using spaces (default)
d[s[0]] = [int(s[j]) for j in range(1,len(s))] # list comprehension to transform string into its for you number lists.
print(d)
,结果是:
{'CA': [11, 5, 4, 12], 'ST': [1, 2, 3, 4], 'OR': [0, 7, 3, 9], 'WA': [10, 10, 5, 2], 'AZ': [-999, 0, 0, 11]}
从这一点开始,您可以对字典中的条目执行任何操作,包括追加。
d['CA'].append(3)
编辑:@ J.R.W。按照我推荐的方式构建字典,然后是你的代码(加上我给出的更正):
fid = open('out.txt') # Just copy what you put in your question inside a file.
l = fid.readlines() # Read the whole file into a list.
first = {} # create a dictionary.
for i in l:
s = i.split() # split the list using spaces (default)
first[s[0]] = [int(s[j]) for j in range(1,len(s))] # list comprehension to transform string into its for you number lists.
print(first)
addn = 11
for key, value in first.items():
if addn in value:
g= "yes"
print(key, addn, g)
#print d
else:
g= "no"
print(key, addn, g)
value.append(300)
value.append(22)
value = sorted(value, key=int)
print("State:", key, value)
,结果:
{'ST': [1, 2, 3, 4], 'CA': [11, 5, 4, 12], 'OR': [0, 7, 3, 9], 'AZ': [-999, 0, 0, 11], 'WA': [10, 10, 5, 2]}
ST 11 no
State: ST [1, 2, 3, 4, 22, 300]
CA 11 yes
State: CA [4, 5, 11, 12, 22, 300]
OR 11 no
State: OR [0, 3, 7, 9, 22, 300]
AZ 11 yes
State: AZ [-999, 0, 0, 11, 22, 300]
WA 11 no
State: WA [2, 5, 10, 10, 22, 300]
,当11存在时(你自己的测试),则表示是,而当它不存在时表示否。