从CSV数据文件计算特定列的平均值

4c8rllxm  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(52)

我需要帮助写一个python代码,可以使用csv模块从csv文件读取数据,不能使用pandas,然后在这种情况下找到每行1-31的平均值。如果月数/行的变化。我不断得到一个索引错误,只是撞我的头在墙上在这一点上。我的大部分经验是在C编程我老,相对较新python。任何帮助都非常感谢。这是我到目前为止的代码。
我在第一个for循环中得到一个错误- indexerror:list index out of range
我很困惑这是怎么发生的,因为我把平均值设置为一个空列表,这需要是一个全局变量设置为0还是一个0值元素的列表?
下面是我目前为止的代码,以及我正在使用的csv数据的示例。

with open("RADIOLOGY.csv") as file:
    data = file.readlines()

def compute_averages(data):
    if not data:
        return []

    # num_months = len(data[0:].split()) - 1  # Calculate the number of months
    num_months = len([row.split()[0] for row in data])
    print(num_months)
    print(len(data))
    # averages = [1] * num_months
    averages = []

    for row in data:
        values = row.split()
        for i in range(num_months):
            if i < len(values) - 1:
                averages[i] += float(values[i - 1])

    for i in range(num_months):
        averages[i] /= len(data)

    return averages

def driver():

    if len(data) < 1:
        print("Not enough data to compute averages.")
        return

    # Assuming the first row contains headers and the first column contains observations
    headers = data[0].split()
    observations = [row.split()[0] for row in data]

    averages = compute_averages(data)

    print(f"Number of months: {len(headers) - 1}")
    print("Averages for each observation:")
    for i, observation in enumerate(observations):
        print(f"{observation}: {averages[i]}")

if __name__ == "__main__":
    driver()

字符串

ve7v8dk2

ve7v8dk21#

看来你的代码的主要问题是你初始化和更新averages列表的方式。因为你从一个空列表[]开始,试图在你的循环中访问averages[i]将导致一个IndexError,因为列表中还没有任何元素。

averages = [0] * num_months  # Initialize averages with zeros

字符串
为了解决这个问题,你应该像上面提到的那样将每个月的平均值初始化为零。假设你的代码中的文件阅读和数据解析部分都能提供所需的结果,这里是你的代码的修订版本,没有任何文件处理,只关注逻辑:

DATA = """Sr    JAN FEB MAR APR
1   2317    5327    997 986
2   2605    5617    1085    1105
3   2364    5490    1061    998
4   2975    6236    1129    1164
5   2766    5877    1206    1104
6   2762    6058    1295    908
7   3020    6602    1274    1089
8   2576    5644    1091    1041
9   3329    6643    1396    1130
10  2989    6284    1330    1192"""

def compute_averages(data):
    if not data:
        return [], 0

    # Assuming the first row contains headers
    num_months = len(data[0].split()) - 1  # Subtract 1 for the first column
    averages = [0] * num_months  # Initialize averages with zeros

    for row in data[1:]:  # Skip the header row
        values = row.split()
        for i in range(1, len(values)):  # Start from 1 to skip the first column
            averages[i - 1] += float(values[i])

    # Calculate average for each month
    for i in range(num_months):
        averages[i] /= len(data) - 1  # Subtract 1 for the header row

    return averages, num_months

def driver():
    data_lines = DATA.split("\n")  # Replace this line with your file read operation

    # Assuming the first row contains headers
    headers = data_lines[0].split()
    averages, num_months = compute_averages(data_lines)

    print(f"Number of months: {num_months}")
    print("Averages for each observation:")
    for i in range(num_months):
        print(f"{headers[i+1]}: {averages[i]:.2f}")  # i+1 to skip the first header

if __name__ == "__main__":
    driver()


输出量:

Number of months: 4
Averages for each observation:
JAN: 2770.30
FEB: 5977.80
MAR: 1186.40
APR: 1071.70


上面的代码假设CSV文件的第一行包含标题,并且每行的第一列不是平均值计算的一部分。此外,它假设数据行中没有缺失值。如果我的假设不准确,您可能需要相应地调整代码。此外,我使用格式`{averages[i]:.2f}用于打印具有两位小数的平均值。

相关问题