【问题标题】:Min values for segments of columns of csv data when another column has same value using numpy当另一列使用numpy具有相同值时,csv数据列段的最小值
【发布时间】:2014-03-31 21:43:31
【问题描述】:

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

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

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

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

到目前为止,我所拥有的是:

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

我现在几乎不知道该怎么做。我试图搜索 col 1 中的每个唯一值,但我不知道如何根据 col2 中的每个值来执行此操作。我知道在熊猫上完成这项工作的方法,但我特别想用 numpy 做一些事情

【问题讨论】:

  • “我知道在 panda 上完成这项工作的方法,但我特别想用 numpy 做一些事情”。作为一个多年来几乎每个工作日都使用numpy的人说话:为什么?
  • 也许是因为我正在尝试不同的方法,而且这是我正在为其他人整理我需要完成的任务的一部分。它基本上是一种尝试学习 numpy 来做这些事情的方法,而不是其他方法,最终目标是学习这些东西,实际数据本身只是作业的一部分。

标签: arrays csv numpy


【解决方案1】:

我认为pandas.DataFrame.grouby 没有等效的 numpy 函数,但您可以尝试类似的方法

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.]))]

【讨论】:

  • 所以我尝试了这个,但一个问题是它只是将第 1 列的东西附加到第 2 列的东西中,而不是根据我需要的第 3 列和第 4 列的东西已选中。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多