2013-04-08 84 views
3

我試圖一次刪除多個列而不利用他們的字段信息。我每個月都會從縣裏得到一份CSV文件,而且我不想與大衆分享多個領域。直到現在,每個月我都會手動刪除每個字段。由於我正在嘗試學習python,我想了解如何創建一個腳本來完成它。我想刪除58個字段,所以我不想爲每個字段寫一個腳本,但希望創建一個刪除它們的範圍。我一直在這裏搜索論壇幾個小時,並嘗試了很多不同的方法,我不知道從哪裏開始或停止。任何幫助,將不勝感激。刪除多列

+0

你有沒有試過這種 [刪除列 - 蟒蛇] [1] [1]:http://stackoverflow.com/questions/7588934/deleting-columns-in-a-csv-with-python – Verbatus 2013-04-08 19:45:11

+0

我確實看過。我有超過100個我想保留的字段,所以我試圖不列出每個字段。除非我誤解了這篇文章的所有建議,否則這是我需要做的。我願意把它們全部列出來,但如果可能的話,寧願避免它。 – user2259051 2013-04-08 19:55:20

回答

1

讓我們假設你有一個CSV文件是這樣的:

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

,你想保持僅列NameAddress

然後,你可以做這樣的事情(Python 3中),利用該DictWriter類的extrasignore參數:

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) 
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) 

(我們也一個行,但我認爲這是像更清晰)


解釋如下。首先,我們可以讀取文件到稱爲存儲對象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列保持到下至-last:

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

等等。