【问题标题】:Conditional statements in a loop循环中的条件语句
【发布时间】:2017-03-10 05:32:06
【问题描述】:

我有一个 5 列 13 行的 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

长/宽/高是植物的长度。

对于数据集中的每一行,我想创建一个条件代码来查看植物是高(高度 > 5)、中(2

植物中的总碳 = 1.8 + 2 * log(volume) 其中体积=长 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)

我不确定我是否正确选择了高度列 - 这是最后一列 - 以及如何将此信息存储在嵌套列表中。

请我指点一下如何简洁有效地编写这个脚本。

【问题讨论】:

  • 顺便说一句,将所有内容缩进 4 个空格(或高亮 + ctrl+k)以保留格式。
  • 这段代码运行对你来说没有错误吗?我在第 10 行得到一个 ValueError?如果您收到错误,这将是您帖子中包含的有用信息。
  • 我对Numpy了解不多,但我觉得height=(shrub_exp,4)应该是height = shrub_exp[4]

标签: python loops pandas numpy if-statement


【解决方案1】:

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,zz 然后是高度。要在类似的列表列表中捕获输出,您可以这样做;

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

【讨论】:

  • 代码现在可以顺利运行 - 感谢您的提示。我需要添加一些代码来将此数据存储在具有 3 列(实验编号/高度测试/碳含量)的嵌套列表中......但是我在开始时跳过了第 0 列和第 1 列..现在这是一个需要解决的问题。 ..有什么建议吗?
  • @LouiseStevens,如果它解决了您的问题,则接受答案被认为是一种很好的形式,如果您有新问题,请提出一个新问题。
【解决方案2】:

在不使用 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]

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 2015-02-10
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-11-21
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多