所以我的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做某事
答案 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.]))]