如何按照某一列的绝对值对numpy数组进行排序?

5

现在我拥有的是:

import numpy as np
# 1) Read CSV with headers
data = np.genfromtxt("big.csv", delimiter=',', names=True)
# 2) Get absolute values for column in a new ndarray
new_ndarray = np.absolute(data["target_column_name"])
# 3) Append column in new_ndarray to data
# I'm having trouble here. Can't get hstack, concatenate, append, etc; to work
# 4) Sort by new column and obtain a new ndarray
data.sort(order="target_column_name_abs")

我需要:

  • 解决方案3):能够将新的“abs”列添加到原始ndarray中,或
  • 另一种方法是能够按照某一列的绝对值对csv文件进行排序。

不起作用的原因是形状不同。尝试使用new_ndarray.shape()并将其与ata["target_column_name"].shape()进行比较。 - Merlin
2个回答

4

这里有一种实现方法。
首先,让我们创建一个样例数组:

In [39]: a = (np.arange(12).reshape(4, 3) - 6)

In [40]: a
Out[40]: 
array([[-6, -5, -4],
       [-3, -2, -1],
       [ 0,  1,  2],
       [ 3,  4,  5]])

好的,让我们假设

In [41]: col = 1

我们想要按照哪一列进行排序,这里是排序代码 - 使用Python的sorted

In [42]: b = sorted(a, key=lambda row: np.abs(row[col]))

让我们将b从列表转换为数组,得到以下结果:
In [43]: np.array(b)
Out[43]: 
array([[ 0,  1,  2],
       [-3, -2, -1],
       [ 3,  4,  5],
       [-6, -5, -4]])

哪个数组按照第一列的绝对值排序后,行也随之排序。


1
这是一个使用pandas的解决方案:
In [117]: import pandas as pd

In [118]: df = pd.read_csv('test.csv')

In [119]: df
Out[119]: 
   a  b
0  1 -3
1  2  2
2  3 -1
3  4  4

In [120]: df['c'] = abs(df['b'])

In [121]: df
Out[121]: 
   a  b  c
0  1 -3  3
1  2  2  2
2  3 -1  1
3  4  4  4

In [122]: df.sort_values(by='c')
Out[122]: 
   a  b  c
2  3 -1  1
1  2  2  2
0  1 -3  3
3  4  4  4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接