【问题标题】:Finding average of every column from CSV file using Python?使用 Python 从 CSV 文件中查找每一列的平均值?
【发布时间】:2021-03-15 10:17:05
【问题描述】:

我有一个 CSV 文件,它有几列和几行。请看上图。图片中只显示了前两个篮子,但在原始 CSV 文件中我有数百个。 [1]:https://i.stack.imgur.com/R2ZTo.png

我想使用 Python 计算每个篮子中每个水果的平均值。这是我的代码,但它似乎无法正常工作。更好的想法?我试图通过导入和使用 numpy 来解决这个问题,但我没有成功。

如果有任何帮助或建议,我将不胜感激!我在这方面完全是新手。

import csv
from operator import itemgetter


fileLineList = []
averageFruitsDict = {} # Creating an empty dictionary here.

with open('Fruits.csv', newline='') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        fileLineList.append(row)

for column in fileLineList:
    highest = 0
    lowest = 0
    total = 0
    average = 0
    for column in row:
        if column.isdigit():
            column = int(column)
            if column > highest:
                highest = column
            if column < lowest or lowest == 0:
                lowest = column
            total += column    
    average = total / 3
  
    averageFruitsDict[row[0]] = [highest, lowest, round(average)]

averageFruitsList = []


for key, value in averageFruitsDict.items():
    averageFruitsList.append([key, value[2]])


print('\nFruits in Baskets\n')
print(averageFruitsList)

--- 所以我知道尝试使用此代码:

import pandas as pd

fruits = pd.read_csv('fruits.csv', sep=';')
print(list(fruits.columns))
fruits['Unnamed: 0'].fillna(method='ffill', inplace = True)
fruits.groupby('Unnamed: 0').mean()
fruits.groupby('Bananas').mean()
fruits.groupby('Apples').mean()
fruits.groupby('Oranges').mean()
fruits.to_csv('results.csv', index=False)

它为我创建了一个新的 CSV 文件,它看起来正确,我没有收到任何错误,但我无法让它计算每个篮子中每个水果的平均值。感谢所有帮助!

【问题讨论】:

  • row 没有在for column in row: 行之前定义你的意思是for row in fileLineList: 然后for column in row: 吗?
  • 将 CSV 读取为 Pandas 数据框并执行 df["columnname"].mean()

标签: python pandas csv multiple-columns


【解决方案1】:

因此,使用您发布的图像并复制/创建一个名为 fruit 的相同测试 csv - 我能够使用 pandas 创建这个快速解决方案。

import pandas as pd
fruit = pd.read_csv('fruit.csv')

对于未命名的列,其中包含带有 NaN 的篮子编号 - 我们使用前面的值填充。通过这样做,我们就可以按篮子编号进行分组(通过使用“未命名:0”列并将平均值应用于所有其他列)

fruit['Unnamed: 0'].fillna(method='ffill', inplace = True)

fruit.groupby('Unnamed: 0').mean()

这将为您提供每个篮子的水果平均值的期望输出(请注意我为篮子 3 编造了值)

【讨论】:

  • 非常感谢!这看起来就像我希望的最终结果一样。反正我得到一个错误Exception has occurred: KeyError 'Unnamed: 0' 如果我理解正确,那个错误意味着密钥没有退出?路径键应该正确吗?我不熟悉熊猫(还没有!),但它会自动将平均值添加到原始 csv 文件中,还是我必须将fruit.to_csv('fruit.csv', index=False)添加到代码中?我正在尝试修复关键错误,以便我可以尝试保存。很抱歉我的问题可能很愚蠢,但我仍然是初学者。谢谢!
  • 我必须查看您的代码才能告诉您错误来自何处。如果你复制我所做的,除了使用正确的文件名,即“Fruits.csv”,那么应该没有问题。要回答您的第二个问题 - 不会自动对原始 csv 进行更改,但是您可以将分组数据帧(带有平均值)存储为新数据帧:即new_df = fruit.groupby('Unnamed: 0').mean(),然后使用结果创建一个 csv(使用 @987654330 @
  • 您好,没问题,很高兴为您提供帮助 - 当您引用抛出 KeyError 的列名时,似乎存在问题。能否请您使用fruits.columns 调用列标题并告诉我您得到了什么。谢谢
  • 我的怀疑是,在读取 csv 时,由于某种原因,您的“未命名”列的标题略有不同,这会引发错误(例如,可能全部小写或不包含空格) - 因此,这很容易通过使用print(list(fruits.columns)) 打印列标题列表并引用正确的列标题来解决
  • 您能否尝试出于其他目的引用该列以查看那里没有 KeyErrors,即print(fruits['Unnamed: 0](pandas 中的关键错误通常意味着它找不到您正在寻找的东西所以必须与列标题有关)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2021-12-13
  • 2016-05-05
  • 1970-01-01
  • 2014-04-20
相关资源
最近更新 更多