2013-03-25 46 views
1

有一個包含大約50列和幾行的逗號分隔文件,我需要刪除始終爲0的所有列(即該列中的所有值爲零)。刪除python中的列

該文件被讀取與下面的代碼段:

with open('data.txt', 'rb') as f: 
    reader.csv.reader(f, delimiter=',') 
    for row in reader: 
     print row 


0 0.1 0.3 0.4 0 
0 0.2 0.5 0.3 0 
0 0.7 0.9 0.2 0 

如何可以精確地除去從該存儲器結構列(即都爲0)。如果沒有重寫和重讀另一個臨時CSV文件來實現這一點,情況會更好。

+0

我們在這裏討論了多少行?首先將它全部讀入內存,這是最容易處理的。 – 2013-03-25 15:13:46

+0

需要刪除列 – Shahzad 2013-03-25 15:13:46

+0

行數大約爲300. – Shahzad 2013-03-25 15:14:18

回答

1

讀取所有行(映射所有浮動值),變換使用zip(*rows),只保留任何已在使用any()非零值的列,使用zip(*columns)變換回行:

with open('data.txt', 'rb') as f: 
    rows = list(map(float, row) for row in csv.reader(f, delimiter=',')) 

rows = zip(*[col for col in zip(*rows) if any(col)]) 

後面的步驟作爲示範:

>>> rows = [[0, 0.1, 0.3, 0.4, 0], [0, 0.2, 0.5, 0.3, 0], [0, 0.7, 0.9, 0.2, 0]] 
>>> zip(*[col for col in zip(*rows) if any(col)]) 
[(0.1, 0.3, 0.4), (0.2, 0.5, 0.3), (0.7, 0.9, 0.2)] 
+0

這是不是可能在Python中做到這一切在內存中,而不是寫入CSV文件並重新讀取它。因爲我需要進一步處理這些數據。 – Shahzad 2013-03-25 15:19:59

+0

@Shahzad:這一切都在記憶中。我以爲你希望它再次寫入CSV;如果你不想要這個,就去掉寫作階段。 – 2013-03-25 15:20:44