我有一个csv文件,它有5列13行,如下所示:
现场试验长宽高
1 1 2.2 1.3 9.6
1 2 2.1 2.2 7.6
1 3 2.7 1.5 2.2
2 1 3 4.5 1.5
2 2 3.1 3.1 4
2 3 2.5 2.8 3
3 1 1.9 1.8 4.5
3 2 1.1 0.5 2.3
3 3 3.5 2 7.5
4 1 2.9 2.7 3.2
4 2 4.5 4.8 6.5
4 3 1.2 1.8 2.7
长/宽/高是植物的长度/宽度/高度。
对于数据集中的每一行,我想要创建一个条件代码,以查看植物是高(高> 5)、中等(2 <=高< 5)还是短(高< 2),然后确定每个植物的碳总量。
植物总碳= 1.8 +2*原木(体积),其中volume=length x宽度x高度。
然后,我想将这些信息作为表存储在嵌套列表中,其中第一列有实验编号,第二列包含字符串“高”、“中等”或“短”(取决于植物的高度),第三列包含植物的碳含量。
到目前为止,这是我的代码:
from __future__ import division
import math
import numpy
shrub_exp=numpy.loadtxt("/Users/louisestevens/Downloads/shrub_volume_experiment.csv",dtype=float,delimiter=',',skiprows=1,usecols=(2,3,4))
for rows in shrub_exp:
print(rows)
height=(shrub_exp,4)
def height_test(height):
if height > 5:
return 'Tall'
elif 2 <= height < 5:
return 'Medium'
else:
return 'Short'
for x in height:
print(height_test(x))
for x,y,z in shrub_exp:
volume=(x*y*z)
total_carbon=1.8 + 2 * math.log(volume)
print(total_carbon)
我不确定是否正确选择了“高度”列--这是最后一列--以及如何将这些信息存储在嵌套列表中。
请给我一些关于如何简洁有效地写这个脚本的建议。
发布于 2016-10-27 15:17:18
不求助于numpy,下面的代码是获得结果的一种方法。假设csv
文件在本地目录中称为shrub.csv,如下所示:
1,1,2.2,1.3,9.6
1,2,2.1,2.2,7.6
1,3,2.7,1.5,2.2
2,1,3,4.5,1.5
2,2,3.1,3.1,4
2,3,2.5,2.8,3
3,1,1.9,1.8,4.5
3,2,1.1,0.5,2.3
3,3,3.5,2,7.5
4,1,2.9,2.7,3.2
4,2,4.5,4.8,6.5
4,3,1.2,1.8,2.7
import math
f=open('shrub.csv')
shrub_exp=f.readlines()
f.close()
def height_test(height):
if height > 5:
return 'Tall'
elif height >= 2:
return 'Medium'
else:
return 'Short'
res=[]
for row in shrub_exp:
site,exp,leng,wid,hgt = row.split(',')
volume=(float(leng)*float(wid)*float(hgt))
total_carbon=1.8 + 2 * math.log(volume)
res.append([exp, height_test(float(hgt)), total_carbon])
for r in res:
print r
注意,对数据没有错误检查。
['1', 'Tall', 8.425169446611104]
['2', 'Tall', 8.917085904771866]
['3', 'Medium', 6.174348482965436]
['1', 'Short', 7.8163095871050965]
['2', 'Medium', 9.098197168204184]
['3', 'Medium', 7.889044875446846]
['1', 'Medium', 7.267435895701576]
['2', 'Medium', 2.270144244358967]
['3', 'Tall', 9.721626339195156]
['1', 'Medium', 8.242226639616785]
['2', 'Tall', 11.688990983183421]
['3', 'Medium', 5.326719989412714]
发布于 2016-10-27 14:08:09
shhrub_exp
是一个列表列表,其中每个列表都是CSV的一行。线
height=(shrub_exp,4)
创建一个包含两个元素的新元组,第一个元素是shrub_exp
,第二个元素是数字4
。这对你一点好处都没有。
如果要处理每一行的高度;
for row in shrub_exp:
print( height_test(row[2]) )
为什么是2
?因为在加载文件时跳过了列0和1。因此,文件中的第4列现在是行数据列表中的第2列。
最后一个for循环将每一行解压到x,y,z
中。那么z
就是高度。要在类似的列表中捕获输出,可以这样做;
results = [] # start with empty list
for length,width,height in shrub_exp:
volume=(length*width*height)
total_carbon=1.8 + 2 * math.log(volume)
results.append( [height_test(height) , volume, total_carbon] ) # add new row to the result
https://stackoverflow.com/questions/40286180
复制相似问题