【问题标题】:Formatting error when removing values from a csv file and returning to a list从 csv 文件中删除值并返回列表时出现格式错误
【发布时间】:2018-02-01 01:24:06
【问题描述】:

我正在读取一个 csv 数据集并将 X 和 Y 坐标返回到单独的列表中。如果 X 坐标小于 5,我将删除 XY 坐标。

csv 的结构如下:

Frame   Time    Player 1_X  Player 1_Y  Player 2_X  Player 2_Y  Player 3_X   Player 3_Y
2920    15:31.0 67.30126517 23.99694962 3.753634891 -2.13857999 69.90505068 -2.504794226
2921    15:31.1 67.28604137 24.20629904 4.122542578 -1.939556384    69.83347832 -2.377951675
2922    15:31.2 67.27140091 24.41644649 4.500764877 -1.724636234    69.7662355  -2.257606667
2923    15:31.3 67.26373215 24.61751047 4.887649337 -1.501664655    69.72997973 -2.135141953
2924    15:31.4 67.28158751 24.80200421 5.294844117 -1.275928937    69.72595034 -2.013856015
2925    15:31.5 67.32005993 24.97498635 5.721823825 -1.042487504    69.73204207 -1.907299936
2926    15:31.6 67.36659395 25.14388582 6.155413991 -0.789898029    69.72947318 -1.811930399
2927    15:31.7 67.40717007 25.31477304 6.58302186  -0.513340546    69.71798806 -1.71190236
2928    15:31.8 67.42824027 25.48791173 7.001268674 -0.212791949    69.69067463 -1.61337704
2929    15:31.9 67.44179872 25.65540719 7.437058638 0.112079642 69.64537185 -1.526329851
2930    15:32.0 67.46336705 25.82181033 7.90386401  0.447834398 69.6061351  -1.441474747

如果 X 值小于 5,我使用下面的代码删除所有玩家的 XY 值。因此,使用此代码将删除玩家 2 的 XY 数据直到第 2923 帧。

with open('Wide_Single_timestamp2.csv') as csvfile :
    readCSV = csv.reader(csvfile, delimiter=',')
    n=0
    for row in readCSV :
        if n == 0 :
            n+=1            
            continue
        x_data = []
        y_data = []
        for (x,y) in [(2,3),(4,5),(6,7)]:
           xcoord = float(row[x])
           if xcoord >= 5:       
                x_data.append(xcoord)
                y_data.append(float(row[y]))
        visuals[1].append(x_data)
        visuals[0].append(y_data)

这是因为从小于 5 的 X 坐标中删除了结果数据。但是,我得到了一个奇怪的格式化结果。空数据列(小于 5 的列)现在由右侧的数据填充。前任。玩家 2 应该是空的,但它现在有玩家 3 的数据(见下文)。

这是 X 列的导出。 (Y 列相同)。如您所见,所有小于 5 的数据都被删除,但右侧的列被移动,这意味着它没有与适当的播放器正确对齐。

在读取文件时删除值时如何保持数据集的相同结构?

2920    67.27140091 69.7662355  
2921    67.26373215 69.72997973 
2922    67.28158751 5.294844117 69.72595034
2923    67.32005993 5.721823825 69.73204207
2924    67.36659395 6.155413991 69.72947318
2925    67.40717007 6.58302186  69.71798806
2926    67.42824027 7.001268674 69.69067463
2927    67.44179872 7.437058638 69.64537185
2928    67.46336705 7.90386401  69.6061351

生成的数据集应如下所示:

2920    67.27140091             69.7662355  
2921    67.26373215             69.72997973 
2922    67.28158751 5.294844117 69.72595034
2923    67.32005993 5.721823825 69.73204207
2924    67.36659395 6.155413991 69.72947318
2925    67.40717007 6.58302186  69.71798806
2926    67.42824027 7.001268674 69.69067463
2927    67.44179872 7.437058638 69.64537185
2928    67.46336705 7.90386401  69.6061351

玩家 3 是否与玩家 3 对齐,而不是在玩家 2 的数据被删除时转移到玩家 2。很抱歉这个冗长的问题。只是想提供上下文。我不明白为什么它会以这种方式格式化或如何修复它。

【问题讨论】:

    标签: python list csv formatting


    【解决方案1】:

    您可以通过定义一个返回已删除低值的行的函数来动态清理整行。您也可以在阅读器对象上使用next() 阅读标题。

    import csv
    
    def clean_row(row, min_val=5, skip_left_cols=2):
        left = row[:skip_left_cols]
        right = [x if float(x)>min_val else '' for x in row[skip_left_cols]]
        return left+right
    
    with open('Wide_Single_timestamp2.csv') as csvfile:
        reader = csv.reader(csvfile)
        header = next(reader)
        data = [clean_row(row) for row in reader]
    

    【讨论】:

    • 我在right = [x if float(x)>min_val else '' for x in row[skip_left_cols]] 上收到了ValueError: could not convert string to float: '.'
    【解决方案2】:

    如下所述,您需要 2 个列表。一个带有所有玩家的 x 坐标,一个带有 y。代码如下:

    import pandas
    data = pandas.read_csv('Wide_Single_timestamp2.csv')
    
    x_list = []
    y_list = []
    for row in data.index:
      for player in ['Player 1', 'Player 2', 'Player 3']:
        x = data.loc[row, player + '_X']
        y = data.loc[row, player + '_Y']
        if x < 5:
          x = None
          y = None
        if x:
          x_list.append(x)
        if y:
          y_list.append(y)
    

    【讨论】:

    • 我知道熊猫。我不想用 null 替换。我可以加载具有空值的数据集。我需要读取 csv 以删除 X 坐标小于 5 的 X 和 Y 坐标数据。不丢失数据结构。
    • 嗨@JeremyAlexander,只是为了澄清您的需要,您想删除 X 和 Y 值(不是记录),其中 X
    • @JeremyAlexander 我已经在上面更新了我的答案。让我知道这是否符合您的需要?
    • 抱歉,我一开始没有提供足够的信息。我需要读取 csv 并将数据返回到列表以用于以后的函数。我已经尝试了您的流程,并且丢失的数据无法使用,因为它返回并出错。查看问题
    • 嗨@JeremyAlexander,所以您希望进程的输出是一个列表,并且列表中的每个项目都应该包含来自以下列的值:['Frame', 'Player 1_X', 'Player 2_X', 'Player 3_X'] (所以基本上你会有一个列表列表)。这是正确的吗?
    【解决方案3】:

    添加另一个可能在性能方面更好的答案,因为它不会遍历所有玩家列的所有记录。

    import pandas
    data = pandas.read_csv('Wide_Single_timestamp2.csv')
    
    data.loc[data['Player 1_X'] < 5, ['Player 1_X', 'Player 1_Y']] = 'nd', 'nd'
    data.loc[data['Player 2_X'] < 5, ['Player 2_X', 'Player 2_Y']] = 'nd', 'nd'
    data.loc[data['Player 3_X'] < 5, ['Player 3_X', 'Player 3_Y']] = 'nd', 'nd'
    
    x_list = data['Player 1_X'].values.tolist() + data['Player 2_X'].values.tolist() + data['Player 3_X'].values.tolist()
    list(filter(('nd').__ne__, x_list))
    
    y_list = data['Player 1_Y'].values.tolist() + data['Player 2_Y'].values.tolist() + data['Player 3_Y'].values.tolist()
    list(filter(('nd').__ne__, y_list))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2019-05-12
      • 1970-01-01
      • 2010-12-10
      • 2021-07-17
      • 2018-07-09
      相关资源
      最近更新 更多