【问题标题】:Delete rows where specific columns contain some value删除特定列包含某些值的行
【发布时间】:2021-05-29 08:13:42
【问题描述】:

我有一个数组,每行包含 8 个值:

data = np.array([[ 1,  2,  3, 5, 6, 7, 15, 27],
                 [ 5,  6,  7, 5, 10, 12, 23, 52],
                 [ 9, 10, 0, 0, 0, 0, 27,44]])

我想删除 data[:,2:5] 等于 0 的每一行(所以 2 到 5 之间的所有列都等于 0)

我发现使用以下可行,但它有点拗口,我无法真正扩展到更多列:

data_nonzero = np.delete(data, np.where(np.bitwise_and(np.bitwise_and((data[:,2]==0), (data[:,3]==0)), np.bitwise_and((data[:,4]==0), (data[:,5]==0)) ) )[0], 0)

我尝试过类似的方法:

new_a = np.delete(data, np.s_[:,2:5] == 0, axis=0)

但这似乎不起作用:

要删除的布尔数组参数 obj 必须是一维的

最好,它会检查每行中 4 列的 2 个条件。比如:

new_a = np.delete(data, np.where(np.s_[:,2:5] == 0 | np.s_[:,2:5] > 50000), axis=0)

【问题讨论】:

  • @mkrieger1 不幸的是没有。我已经看过那个帖子了。我最终会回到我不在的地方:有一个巨大的声明(尽管它可以分成一些次要的声明)。真的希望有另一种方式。我不一定需要多个条件,而是针对多个(但不是全部)列的一个条件

标签: python numpy numpy-ndarray


【解决方案1】:

我想出了一个解决方案:
data.csv 文件包含:

var1, var2, var3, var4, var5, var6, var7
x,x,0,0,0,0,x
x,x,0,0,0,0,x
x,x,65535,65535,65535,65535,x
x,x,0,40,116,3,x
x,x,65535,95,208,2,x
x,x,3,147,277,2,x
x,x,2,203,325,2,x

代码:

data = genfromtxt(filename[0], delimiter=',',skip_header=1)

print('------ Original data ------')
print(data[0:7,:])


new_a = np.delete(data, ~np.any(data[:,2:5], axis=1),axis=0)
print('------ Rows where data[:,2:5] == 0 removed ------')
print(new_a[0:5,:])

new_b = np.delete(new_a, np.all(new_a[:,2:5] > 60000,axis=1),axis=0)
print('------ Rows where data[:,2:5] > 60000 removed ------')
print(new_b[0:4,:])

结果:

------ Original data ------
[[x x 0.00 0.00 0.00 0.00 x]
[x x 0.00 0.00 0.00 0.00 x]
[x x 65535.00 65535.00 65535.00 65535.00 x]
[x x 0.00 40.00 116.00 3.00 x]
[x x 65535.00 95.00 208.00 2.00 x]
[x x 3.00 147.00 277.00 2.00 x]
[x x 2.00 203.00 325.00 2.00 x]]

------ Rows where data[:,2:5] == 0 removed ------
[[x x 65535.00 65535.00 65535.00 65535.00 x]
[x x 0.00 40.00 116.00 3.00 x]
[x x 65535.00 95.00 208.00 2.00 x]
[x x 3.00 147.00 277.00 2.00 x]
[x x 2.00 203.00 325.00 2.00 x]]

------ Rows where data[:,2:5] > 60000 removed ------
[[66.01 -46.05 0.00 40.00 116.00 3.00 x]
[66.01 -39.46 65535.00 95.00 208.00 2.00 x]
[66.01 -32.87 3.00 147.00 277.00 2.00 x]
[66.01 -26.28 2.00 203.00 325.00 2.00 x]]

【讨论】:

    【解决方案2】:

    在这种特殊情况下,我只会使用布尔索引来否定您的条件,即,

    >>> data[(data[:, 2:6] != 0).any(axis=1), ...]
    array([[ 1,  2,  3,  5,  6,  7, 15, 27],
           [ 5,  6,  7,  5, 10, 12, 23, 52]])
    

    换句话说,您要选择包含任何非零值的行。

    【讨论】:

    • 也许我遗漏了一些东西,但您的语句不会删除 Python 3.8 中的零行。此外:我不想删除任何在第 2 列和第 5 列之间的任何一个位置都为零的行;只有所有列都包含 0 的行。数组中允许存在零;只是没有同时出现在所有 4 个位置
    • @KristianSlot 你是什么意思?这正是此代码所做的,除了如果您指的是第 2 列到第 5 列包含,则必须将条件更改为 data[:, 2:6]。你期望的输出是什么???
    • @KristianSlot 上面的代码不会删除在第 2 列和第 5 列(含)之间的任何位置为零的任何行,它会选择其中包含任何非零值的所有行,即排除那些列全为零的所有抛出
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2013-07-31
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多