【问题标题】:compare multiple rows python比较多行python
【发布时间】:2018-05-07 22:16:17
【问题描述】:

我是编程新手。 请帮我完成以下任务。 我有一个未知行的 csv 数据。但每一行的元素数量如下:

Right   \FR\Window open\Start   16.9    11.2    18.2
Right   \FR\Window open\Start   16.5    11.7    17.5
Right   \FR\Window open\Start   16.9    11.7    18
Right   \FR\Window open\End     7.61    1.76    8.37
Right   \FR\Window open\End     7.3     1.74    8.6
Right   \FR\Window open\End     7.64    2.45    8.43
Right   \FR\Window close\Start  13      8.2     14.4
Right   \FR\Window close\Start  12.9    7.55    14.5

我想计算具有相同字符串 \FR\Window open\Start\FR\Window open\End 等的那些行的平均值。

谢谢

【问题讨论】:

    标签: python compare rows


    【解决方案1】:

    您可以使用 python 中的 csv 模块从 csv 文件中获取数据,如下所示:

    import csv
    
    start_values = {'col3':[], 'col4':[], 'col5':[]}
    end_values = {'col3':[], 'col4':[], 'col5':[]}
    
    with open('example.csv', newline='') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            if row['col2'] == '\FR\Window open\Start':
                start_values['col3'].append(float(row['col3']))
                start_values['col4'].append(float(row['col4']))
                start_values['col5'].append(float(row['col5']))
            if row['col2'] == '\FR\Window open\End':
                end_values['col3'].append(float(row['col3']))
                end_values['col4'].append(float(row['col4']))
                end_values['col5'].append(float(row['col5']))
    
        csvfile.close()
    print('Start average for col3: {:.2f}, col4: {:.2f}, col5: {:.2f}'.format(sum(start_values['col3'])/len(start_values['col3']), sum(start_values['col4'])/len(start_values['col4']), sum(start_values['col5'])/len(start_values['col5'])))
    print('End average for col3: {:.2f}, col4: {:.2f}, col5: {:.2f}'.format(sum(end_values['col3'])/len(end_values['col3']), sum(end_values['col4'])/len(end_values['col4']), sum(end_values['col5'])/len(end_values['col5'])))
    

    将此逗号分隔的 example.csv 与您的数据一起使用,

    col1,col2,col3,col4,col5
    Right,\FR\Window open\Start,16.9,11.2,18.2
    Right,\FR\Window open\Start,16.5,11.7,17.5
    Right,\FR\Window open\Start,16.9,11.7,18
    Right,\FR\Window open\End,7.61,1.76,8.37
    Right,\FR\Window open\End,7.3,1.74,8.6
    Right,\FR\Window open\End,7.64,2.45,8.43
    Right,\FR\Window close\Start,13,8.2,14.4
    Right,\FR\Window close\Start,12.9,7.55,14.5
    

    该程序将每一行读入字典以便于访问,正如您在寻找开始和结束的 ifs 中看到的 (if row['col2'] == '\FR\Window open\Start':)。然后它用它们各自的值填充start_valuesend_values 字典。最后,这些字典将如下所示:

    {'col3': [16.9, 16.5, 16.9, 13.0, 12.9], 'col4': [11.2, 11.7, 11.7, 8.2, 7.55], 'col5': [18.2, 17.5, 18.0, 14.4, 14.5]}
    

    上面那个是start_values。 “开始”行上的每一列数字都整齐地打包成一个列表。然后你所要做的就是print(sum(list)/len(list)) 和你的平均值,使用 String.format 整齐地格式化为 2 位小数。

    您可以在official documentation 上了解有关使用 CSV 文件的更多信息。 here 是格式化字符串的便捷指南!

    【讨论】:

    • 非常感谢您的帮助。我理解你的解决方案。不幸的是,当我运行此代码时,我仍然遇到问题: print('Col3: {:.2f}, col4: {:.2f}, col5: {:.2f}'.format(sum(start_values[' col3'])/len(start_values['col3']), sum(start_values['col4'])/len(start_values['col4']), sum(start_values['col5'])/len(start_values[' col5']))) ZeroDivisionError:除以零我明天会尝试仔细查看。
    • @AlexeAdrianMarius 你的 csv 文件是用逗号分隔的吗?该错误意味着其中一个列表的长度为零,所以我的猜测是从 csv 中获取数据时存在问题。仅当 csv 文件的格式类似于我的答案中的格式时,此代码才有效;可以用记事本打开查看。
    • 非常感谢。它现在正在工作。我之前使用了错误的 csv 文件。
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2015-12-10
    • 2011-07-18
    • 1970-01-01
    • 2022-01-22
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多