如何删除 CSV 文件中的列?

问题描述 投票:0回答:12

我有一个

.csv
文件,如下所示:

day,month,year,lat,long
01,04,2001,45.00,120.00
02,04,2003,44.00,118.00

我正在尝试删除“年份”列及其所有条目。 总共有 40 多个条目,年份范围为 1960-2010。

python csv row-removal
12个回答
64
投票
import csv
with open("source","rb") as source:
    rdr= csv.reader( source )
    with open("result","wb") as result:
        wtr= csv.writer( result )
        for r in rdr:
            wtr.writerow( (r[0], r[1], r[3], r[4]) )

顺便说一句,

for
循环可以删除,但并没有真正简化。

        in_iter= ( (r[0], r[1], r[3], r[4]) for r in rdr )
        wtr.writerows( in_iter )

此外,您可以以超字面的方式坚持删除列的要求。 我发现这总体上是一项糟糕的政策,因为它不适用于删除多个列。 当您尝试删除第二个时,您会发现位置全部发生了变化,并且结果行并不明显。 但仅对于一列,这有效。

            del r[2]
            wtr.writerow( r )

53
投票

使用Pandas模块会更容易。

import pandas as pd
f=pd.read_csv("test.csv")
keep_col = ['day','month','lat','long']
new_f = f[keep_col]
new_f.to_csv("newFile.csv", index=False)

这是简短的解释:

>>>f=pd.read_csv("test.csv")
>>> f
   day  month  year  lat  long
0    1      4  2001   45   120
1    2      4  2003   44   118
>>> keep_col = ['day','month','lat','long'] 
>>> f[keep_col]
    day  month  lat  long
0    1      4   45   120
1    2      4   44   118
>>>

6
投票

使用字典抓取标题然后循环遍历可以清楚地得到你需要的东西。

import csv
ct = 0
cols_i_want = {'cost' : -1, 'date' : -1}
with open("file1.csv","rb") as source:
    rdr = csv.reader( source )
    with open("result","wb") as result:
        wtr = csv.writer( result )
        for row in rdr:
            if ct == 0:
              cc = 0
              for col in row:
                for ciw in cols_i_want: 
                  if col == ciw:
                    cols_i_want[ciw] = cc
                cc += 1
            wtr.writerow( (row[cols_i_want['cost']], row[cols_i_want['date']]) )
            ct += 1

6
投票

我会使用 Pandas 与

col number

f = pd.read_csv("test.csv", usecols=[0,1,3,4])
f.to_csv("test.csv", index=False)

3
投票

您可以直接删除该列,只需

del variable_name['year']

2
投票

您可以使用

csv
包迭代您的 csv 文件并将所需的列输出到另一个 csv 文件。

下面的示例未经测试,应该说明解决方案:

import csv

file_name = 'C:\Temp\my_file.csv'
output_file = 'C:\Temp\new_file.csv'
csv_file = open(file_name, 'r')
## note that the index of the year column is excluded
column_indices = [0,1,3,4]
with open(output_file, 'w') as fh:
    reader = csv.reader(csv_file, delimiter=',')
    for row in reader:
       tmp_row = []
       for col_inx in column_indices:
           tmp_row.append(row[col_inx])
       fh.write(','.join(tmp_row))

2
投票

在我的脑海中,这将在没有任何类型的错误检查或配置任何内容的情况下完成。那是“留给读者”。

outFile = open( 'newFile', 'w' )
for line in open( 'oldFile' ):
   items = line.split( ',' )
   outFile.write( ','.join( items[:2] + items[ 3: ] ) )
outFile.close()

2
投票

我将为这个问题添加另一个答案。由于OP没有说他们需要使用Python来完成此操作,因此删除列的最快方法(特别是当输入文件有数十万行时)是使用

awk

这就是 awk 擅长解决的问题类型:

$ awk -F, 'BEGIN {OFS=","} {print $1,$2,$4,$5}' input.csv

(如果您需要将输出保存到文件中,请随意将

> output.csv
附加到上面的命令中)

100% 归功于 @eric-wilson,他在 10 年前提供了这个很棒的答案,作为对原始问题的评论,几乎没有任何功劳。


1
投票

尝试使用 pandas 进行 python 并排除您不想拥有的列:

import pandas as pd

# the ',' is the default separator, but if your file has another one, you have to define it with sep= parameter
df = pd.read_csv("input.csv", sep=',')
exclude_column = "year"
new_df = df.loc[:, df.columns != exclude_column]
# you can even save the result to the same file
new_df.to_csv("input.csv", index=False, sep=',')

1
投票

我在 python 中使用 pandas 的

drop
:

import pandas as pd

df = pd.read_csv("old.csv")
new_df = df.drop("year", axis=1)
new_df.to_csv("new.csv", index=False)

0
投票

这取决于您如何存储解析的 CSV,但通常您需要 del 运算符。

如果你有一个字典数组:

input = [ {'day':01, 'month':04, 'year':2001, ...}, ... ]
for E in input: del E['year']

如果你有一个数组的数组:

input = [ [01, 04, 2001, ...],
          [...],
          ...
        ]
for E in input: del E[2]

0
投票

尝试:

result= data.drop('year', 1)
result.head(5)
© www.soinside.com 2019 - 2024. All rights reserved.