当另一列使用numpy具有相同值时,csv数据列的段的最小值

时间:2014-03-31 21:43:32

标签: arrays csv numpy

所以我的csv数据总共大约有9列。我特意想看看 这9列中的4列(第1列,第2列,第4列和第8列)使用第一列和第二列来确定要返回的列中的哪些行。

所以我的数据看起来像这样(几行)

col 1     col 2       col 4    col 8
0         -4          19       21
0         5           16       18
1         5           17       3 
1         7           5        4
1         9           6        5
2         0           13       7  
3         12          14       6
3         -12         7        8

我想要做的是col 1中的每个唯一值(0,1,2,3等......)我想查看col 2并找到最小值(我也必须这样做该列中的最大值,但类似的想法),并返回col 1中每个数字在col 2中具有最小数量的行。

直到现在我所拥有的只是:

    data = np.loadtxt(filenm, skiprows = 1, dtype = float, delimiter = ',')
    unique = np.unique(data[:,0])

我现在几乎无能为力。我已经尝试搜索col 1中的每个唯一值,但我不知道如何根据col2中的每个值来执行此操作。我知道如何在熊猫身上完成这项任务,但我特意尝试使用numpy做某事

1 个答案:

答案 0 :(得分:1)

我不相信numpy有相同的pandas.DataFrame.grouby功能,但您可以尝试这样的事情

unq = np.unique(data[:, 0]).tolist()
mins = []

for val in unq:
    mask = data[:, 0] == val
    mins.append((val, data[:, 1][mask].min()))

或者您可以使用itertools.groupby ...它的可读性较差,但更有趣。

from itertools import groupby
from operator import itemgetter

grp = groupby(enumerate(data[:, 1].tolist()), key=lambda x : data[:, 0][x[0]])
mins = [(i, min(group, key=itemgetter(1))[1]) for i, group in grp]

在任何一种情况下,mins都将是

[(0.0, -4.0), (1.0, 5.0), (2.0, 0.0), (3.0, -12.0)]

注意: 如果您使用itertools.groupby,则必须按照您首先填写的列进行排序。

修改

为每个组获取包含第2列中最小值的整行(

unq = np.unique(data[:, 0]).tolist()
mins = []

for val in unq:
    mask = data[:, 0] == val
    i = data[mask][:, 1].argmin()
    mins.append((val, data[mask][i, 1:]))

使用itertools

grp = groupby(enumerate(data[:, 1].tolist()), key=lambda x : data[:, 0][x[0]])
mins = [(i, data[min(group, key=itemgetter(1))[0], 1:]) for i, group in grp]

使用mins方法

[(0.0, array([ -4.,  19.,  21.])),
 (1.0, array([  5.,  17.,   3.])),
 (2.0, array([  0.,  13.,   7.])),
 (3.0, array([-12.,   7.,   8.]))]