从csv文件中读取行的每一列数据并根据列索引应用公式

我有一个 CSV 文件中的土壤样本


        pH    K      Zn      Fe  Cu     Mn

Soil 1  7.74 279    0.48    6.4 0.21    4.7

Soil 2  9.02 247    0.27    6.4 0.16    5.6

Soil 3  7.8  265    0.46    6.2 0.51    6.1

Soil 4  8.36 127    0.5     3.1 0.28    2.3

我需要读取每个土壤样本,对于每个元素,我需要添加一个特定的公式来检查土壤是否肥沃、不肥沃或肥沃。


我的概念是将 CSV 转换为列表,然后从收到的 2D 列表中,我可以迭代该行的每个元素并检查每个营养素的参数。


我使用了以下代码:


    import csv

import pandas as pd

from pandas import DataFrame


with open('datan.csv', newline='') as soil_file: #CSV datafile

    soil_reader = csv.reader(soil_file)

    data = list(soil_reader)

    data.pop(0) #first row is string

    for i in data:

        for j in i: #iterate through each element of the row

            if((float(j) >= 5.1 and float(j) <= 6.5) or (float(j) >= 7.6 and float(j) <= 8.5)):

                print("Soil is low fertile")  #condition

            elif((float(j) < 5) or (float(j) > 8.5)):

                print("Soil is Non fertile")

            else:

                print("Soil is fertile")

问题是,循环从第一个元素开始,直到最后一行的末尾,而不会在行末尾停止,并且在所有情况下条件均为 true。这样我就得到了所有 24 个元素的结果。


我需要的是循环应该检查第一个土壤样本并打印结果,然后移动到下一个土壤样本。


我不知道如何在这里实现 pandas,但在某处读过,通过 Dataframe 我可以使用以下方式读取索引:


df.index

但这会读取整个列而不是行!我需要的是有点像:


for Soil 1:

if df[index] == 'ph':

Use func pH()

elif df[index] == 'K':

Use func K()

等等...


PS我犯了一个愚蠢的错误,没有在循环中添加计数器


我对代码进行了一些更改,现在循环在读取第一个元素后停止,但不检查函数内的其他条件。


import csv

import pandas as pd

from pandas import DataFrame



def pH(j):

    if ((float(j) >= 5.1 and float(j) <= 6.5) or (float(j) >= 7.6 and float(j) <= 8.5)):

        print("Soil is low fertile")


喵喵时光机
浏览 121回答 1
1回答

幕布斯7119047

您可以使用 df['pH'] 或 df.pH 直接访问列(如果列名称没有空格或特殊字符)您是否同意再有一个代表生育能力的专栏,或者您是否需要打印声明(想在评论中询问,但没有足够的声誉)对于表示生育力的另一列,您可以使用 loc 并通过您的过滤器df.loc[df.ph>=5.1,"fertility"] = "fertile"用于循环遍历您的列:for col in df.columns:&nbsp; # displaying&nbsp;&nbsp; display(df.loc[df[col]>6])如果您只有多个输出和每个输出的公式,您可以使用:filter_criteria = {"fertile":(df.pH>8)&(df.K<200),"non-fertile":(df.pH>7.5)&(df.K>240),"low":(df.pH>7.5)&(df.K>270)}for key in filter_criteria.keys():&nbsp;df.loc[filter_criteria[key],"fertility"] = key
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python