我有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)
答案 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
为结构化数组提供所需的专栏名称。