3

我试图一次删除多个列而不使用它们的字段信息。我每个月都会从县里收到一个 CSV 文件,其中有多个字段我不想与公众分享。到目前为止,每个月我都会手动删除每个字段。由于我正在尝试学习 python,我想学习如何创建一个脚本来做到这一点。我要删除 58 个字段,因此我不想为每个字段编写脚本,但希望创建一个范围来删除它们。我已经在这里搜索了几个小时的论坛,并尝试了很多不同的方法,以至于我不知道从哪里开始或停止。任何帮助,将不胜感激。

4

2 回答 2

6

我很懒,所以我喜欢尽可能使用现有的库,并且已经成为pandas库的传道者。使用@Tim Pietzcker 的例子:

Name,Sex,Address,Age
John,M,New York,40
Mary,F,Los Angeles,30

我们可以只保留我们想要使用的列:

import pandas as pd
df = pd.read_csv("to_remove.csv")
keep_cols = ["Name", "Address"]
new_df = df[keep_cols]
new_df.to_csv("removed.csv", index=False)

(我们也可以单行,但我认为这样更清楚。)


解释如下。首先,我们可以将文件读入一个名为 a 的存储对象DataFrame

>>> import pandas as pd
>>> df = pd.read_csv("to_remove.csv")
>>> df
   Name Sex      Address  Age
0  John   M     New York   40
1  Mary   F  Los Angeles   30

我们可以从此对象中选择一列或多列:

>>> df[["Name", "Sex"]]
   Name Sex
0  John   M
1  Mary   F

然后写出来:

>>> new_df = df[["Name", "Sex"]]
>>> new_df.to_csv("removed.csv", index=False)

(该index=False位只是告诉它不要添加计算行数的列,上面的数字 0、1),产生

Name,Sex
John,M
Mary,F

我们还可以决定只保留以字母“A”开头的列:

>>> [col for col in df.columns if col.startswith("A")]
['Address', 'Age']
>>> df[[col for col in df.columns if col.startswith("A")]]
       Address  Age
0     New York   40
1  Los Angeles   30

或使用该.ix方法仅保留从 #1 到倒数第二个的列:

>>> df.ix[:,1:-1]
  Sex      Address
0   M     New York
1   F  Los Angeles

等等。

于 2013-04-08T22:08:42.123 回答
1

假设您有一个这样的 CSV 文件:

Name,Sex,Address,Age
John,M,New York,40
Mary,F,Los Angeles,30

并且您只想保留NameAddress.

然后你可以做这样的事情(Python 3),利用类的extrasignore参数DictWriter

import csv
fields = ["Name", "Address"]

with open("test.csv") as infile, open("out.csv", "w", newline="") as outfile:
    #           in Python 2, use open("out.csv", "wb") as outfile:
    r = csv.DictReader(infile)
    w = csv.DictWriter(outfile, fields, extrasaction="ignore")
    w.writeheader()
    for row in r:
        w.writerow(row)

结果:

Name,Address
John,New York
Mary,Los Angeles

如果你想反过来做,即指定从文件中删除哪些列 ,那么它有点复杂:

import csv
delete = ["Sex", "Age"]

with open("test.csv") as infile, open("out.csv", "w", newline="") as outfile:
    #           in Python 2, use open("out.csv", "wb") as outfile:
    r = csv.DictReader(infile)
    firstrow = next(r)  # Need to read the first row so we know the fieldnames
    fields = r.fieldnames
    w = csv.DictWriter(outfile, 
                       [field for field in fields if not field in delete], 
                       extrasaction="ignore")
    w.writeheader()
    w.writerow(firstrow)
    for row in r:
        w.writerow(row)
于 2013-04-08T21:38:49.967 回答