Python numpy按字符串列的值拆分csv文件

时间:2013-07-10 01:10:34

标签: python sorting numpy group-by

我有5000行数据在csv文件中看起来如下所示,我想使用numpy数组按最后一列6(即A,B)进行分组,因为我会在之后绘制每组中的数据

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加载数据时,我必须指定dtype = None,否则A term变为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 IE浏览器。 v [V [:,0] .argsort()]

但是,这里有一个链接,提到numpy将我的记录视为我的dtype的一维数组(设置为无),我遇到了同样的索引错误,试图对此进行排序: Numpy Array Column Slicing Produces IndexError: invalid index Exception

问题:

1)如何根据第6列的字符串值使用groupby分割numpy数组,以便单独绘制它们?

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)

2 个答案:

答案 0 :(得分: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

正如我在其他地方所说的那样,让您的生活更轻松,并使用pandas加载数据和组(确保首先运行data.seek(0)):

import pandas as pd

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

另外,您甚至可以使用数据框本身进行绘图。

答案 1 :(得分: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为结构化数组提供所需的专栏名称。