2013-07-10 63 views
2

我有5000行數據,看起來像在csv文件中的以下內容,我想按最後一列6(即A,B)使用numpy數組,因爲之後我會在每個組中繪製數據。Python numpy按字符串列的值拆分csv文件

Title 
Date, Time, Value1, Value2, Value3, Value4, Value5 
,, Unit1, Unit2, Unit3,, 
2012-04-02,00:00, 85.5333333333333, 4.87666666666667, 8.96, 323.27,A 
2012-04-02,00:30, 196.5, 5.49, 8.42, 323.15,B 
2012-04-02,01:00, 68.2, 4.47, 7.83, 325.30,A 
2012-04-02,01:30, 320.9, 6.77333333333333, 8.05, 326.63,B 

我不得不當我加載與np.genfromtxt的數據,或者指定D型=無的一個術語變成NaN How to use numpy.genfromtxt when first column is string and the remaining columns are numbers?

我想使用itertools GROUPBY返回基於所有值在最後一列,在這裏提到:How do I use Python's itertools.groupby()? 但首先,我需要排序numpy數組。

我試圖使用高級索引,通過拼接第六列並對其進行排序 Python (Numpy) array sorting 即, v [v,0] .argsort()]

但是,這裏是一個鏈接,提到numpy會把我的記錄當作我的dtype(它被設置爲none)的一維數組,並且我碰到相同的索引錯誤嘗試這種排序:我怎麼能分裂numpy的陣列使用了基於第6列的字符串值GROUPBY爲了分別繪製他們

1): Numpy Array Column Slicing Produces IndexError: invalid index Exception

問題?

2)如果能夠跳過第一行(標題)和第三行(單位)並且保留第二行(列標題)和數據,那麼也很好。任何人都知道如何使用可用選項輕鬆完成該任務?

這是劇本我到目前爲止,:

import numpy as np 
from matplotlib import pyplot as plt 
from itertools import groupby 
import csv 

regression_data_dp1 = np.genfromtxt(「file.csv」, delimiter=',', skiprows=3, dtype=None) 

sortindex = regression_data_dp1[:,6] 

#Error is hit at this step: 
# sortindex = regression_data_dp1[:,6] 
#IndexError: invalid index 

regression_data_dp1_sorted = regression_data_dp1[ regression_data_dp1(:,column_WRF_wind_direction).argsort()] 

for key, group in groupby(regression_data_dp1, lambda x: x[0]): 
    print key 

    with open(「file_" + key.strip() + ".csv", 'w') as data_file: 
     wr=csv.writer(data_file, quoting=csv.QUOTE_ALL) 
     for item in (group):    
      wr.writerow(item) 
+0

什麼是標題?你有比數據字段更多的標題;這是數據文件的樣子嗎? – dawg

+0

@drewk標題只是對文件ie的描述。 「這是......等的報告」。第二行是標題,有7個標題。下一行是單位。然後數據也有7列。 – frank

回答

2

相反排序陣列的行,並使用itertools.groupby你可以使用group = arr[arr['f6']==key]選擇具有相同key行:

import numpy as np 
import csv 

def load_csv(filename): 
    with open(filename) as f: 
     next(f) 
     header = [item.strip() for item in next(f).split(',')] 
    arr = np.genfromtxt("file.csv", delimiter=',', skiprows=3, dtype=None) 
    arr.dtype.names = header 
    return arr 

arr = load_csv("file.csv") 
keys = np.unique(arr['Value5']) 

for key in keys: 
    group = arr[arr['Value5']==key] 
    filename = 'file_{}.csv' .format(key.strip()) 
    with open(filename, 'w') as data_file: 
     wr = csv.writer(data_file, quoting=csv.QUOTE_ALL) 
     wr.writerows(group) 

沒有直接的工具可以告訴np.genfromtxt使用第二行作爲標題。最簡單的方法可能是打開文件,將第二行寫入頭文件列表,關閉文件,然後使用genfromtxt加載數組,並使用arr.dtype.names = header爲結構化數組提供所需的列名稱。

+0

謝謝,我喜歡這個分組的選擇,因爲它允許我立即從小組中獲得一列進行繪圖,這對於groupby來說我無法完成。 即。 從matplotlib進口pyplot作爲PLT 爲鍵中的鍵: ... 值3 =基團[ '值3'] VALUE4 =基團[ '值4'] plt.scatter(值3,值4) plt.show() – frank

4

爲了舉例,讓我們使您的csv文件更簡單。

from StringIO import StringIO 
import numpy as np 
import itertools 

data = StringIO(""" 
Col1,Col2,Col3 
1,2,A 
2,3,B 
8,7,A 
""".strip()) 
arrays = np.genfromtxt(data, dtype=object, delimiter=',', skip_header=1) 
sorted_arrays = arrays[np.argsort(arrays[:, 2])] # now it's sorted - yeehaw! 

for k, group in itertools.groupby(arrays, lambda x: x[2]): 
    # do something 

正如我在其他地方所說的,讓您的生活更輕鬆,用熊貓的數據和組加載(請確保您運行data.seek(0)在前):

import pandas as pd 

df = pd.read_csv(data) 
for k, group in df.groupby(["Col3"]): 
    # do something with group 

另外,你甚至可以做用數據框本身繪圖。

+0

感謝您提供更簡單的示例,我在dtype = object中添加了我的初始示例,現在可以進行排序。從numpy.dtype文檔中並不清楚這是排序所必需的。現在,我對numpy很滿意,但是感謝大家分享熊貓。 – frank

+0

@ user2412730您需要dtype = object以防止將字符串轉換爲'NaN'。排序不依賴於具有'dtype = object',它僅取決於實際不同的值(如果它們都是'NaN',則不會發生) –

+0

如果不指定dtype,則字符串顯示爲NaN。我之前嘗試過指定dtype = None,並且字符串不以NaN出現,而是作爲實際字符串出現。但是,排序命中索引錯誤,直到我改變dtype = object。 – frank