2016-10-27 2 views
0

У меня есть 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 * журнал (объем), где объем = длина х ширина х высота.

Затем я хочу сохранить эту информацию как таблицу во вложенном списке, где первый столбец имеет номер эксперимента, второй столбец содержит строку «высокий», «средний» или «короткий» в зависимости от высоты установки , а третья колонка содержит содержание углерода в установке.

Это мой код до сих пор:

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) 

Я уверен, если я выбрал столбец высоты - что в последней колонке - правильно и как хранить эту информацию в вложенном списке.

Возможно, у меня есть некоторые указания относительно того, как писать этот сценарий лаконично и эффективно.

+0

Btw, отступы всего на 4 пробела (или выделить + ctrl + k), чтобы сохранить форматирование. – Carcigenicate

+0

Этот код работает без ошибок для вас? Я получаю ValueError в строке 10? Если вы получите сообщение об ошибке, это будет полезной информацией для включения в ваш пост. – CAB

+0

Я не знаю много Numpy, но я думаю, что 'height = (shrub_exp, 4)' должен быть 'height = shrub_exp [4]' –

ответ

0

Не прибегая к 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] 
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 в списке данных строки.

Ваш финал для цикла распаковывает каждую строку в 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 
+0

Код теперь работает гладко - спасибо за подсказку. Мне нужно добавить код для хранения этих данных во вложенном списке с тремя столбцами (номер эксперимента/высотный тест/содержание углерода) ... однако я сначала пропустил столбцы 0 и 1. Это теперь проблема для решения. ..какие-либо предложения? –

+0

@ LouiseStevens, считается хорошей формой, чтобы принять ответ, если он решил вашу проблему, и задать новый вопрос, если у вас есть новая проблема. – IanS

Смежные вопросы