【问题标题】:how to remove all rows in the CSV file which a value is greater than another?如何删除CSV文件中值大于另一个值的所有行?
【发布时间】:2015-12-04 01:35:30
【问题描述】:

我有一个 csv 文件,300 行:

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 1,1.80,80,78,78,82,82 2,1.60,58,56,60,60,56 3,1.90,100,98,102,98,102

我想要一个文件删除列 MEAN WEIGHT> 75 的所有行并获取另一个新文件

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 1,1.80,80,78,78,82,82 3,1.90,100,98,102,98,102

【问题讨论】:

标签: python csv unicode


【解决方案1】:

使用普通的python:

orig = open('original.csv', 'r')
modi = open('modified.csv', 'w')

#header
modi.write(orig.readline())

# data lines
for line in old:
    if float(line.split(',')[2]) <= 75:
        modi.write(line)

orig.close()
modi.close()

【讨论】:

  • 我试过但只出现在新文件中的header.
【解决方案2】:

按照@Vignesh Kalai 的建议,使用熊猫

import pandas as pd

df = pd.read_csv("yourfile.csv", sep=",")

df[ df["MEAN WEIGHT"] > 75 ].to_csv("yournewfile.csv", index=False)

它已经完成了。

附:您要求的值小于 75,但显示的是相反的值。如果是第一种情况,请将“&gt; 75”替换为“&lt;= 75”。

【讨论】:

  • 它有效,但添加了一个新列 ,ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003 0,1, 1.8,80,78,78,82,82 2,3,1.9,100,98,102,98,102
  • @PedroSousa 当然,使用 index = False(见编辑)
【解决方案3】:

您可以按如下方式使用 Python csv 库:

import csv

with open('input.csv', 'r') as f_input, open('output.csv', 'wb') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)

    # Write the header
    csv_output.writerow(next(csv_input))

    for cols in csv_input:
        if int(cols[2]) <= 75:    # Keep weights <= 75
            csv_output.writerow(cols)

所以有了你给的数据,你会得到下面的output.csv文件:

ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003
2,1.60,58,56,60,60,56

【讨论】:

    【解决方案4】:

    如果您愿意接受非 Python 解决方案并访问 bash shell 或 awk

    $ awk -F, '$3>75' filename 
    
    ID,HEIGHT,MEAN WEIGHT,20-Nov-2002,05-Mar-2003,09-Apr-2003,23-Jul-2003
    1,1.80,80,78,78,82,82
    3,1.90,100,98,102,98,102
    

    【讨论】:

      【解决方案5】:

      打印到屏幕的 Perl 解决方案,类似于 karakfa 的 Awk 解决方案:

      perl -F, -ane 'print if $. == 1 or $F[4] > 75' filename
      

      @F 自动拆分数组从索引 $F[0] 开始,而 awk 字段从 $1 开始

      这个变体就地编辑文件:

      perl -i -F, -ane 'print if $. == 1 or $F[4] > 75' filename
      

      此变体在原地编辑文件,并备份filename.bak

      perl -i.bak -F, -ane 'print if $. == 1 or $F[4] > 75' filename
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-10
        • 2019-04-08
        • 2021-09-26
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多