我有一个大型 csv 文件,有 5300 列 x 150 行。每列都有一个数字标题(第一列除外,它是字符串)。每行都有一个与其关联的样本名称。以下是格式示例:
s,1,2,3,4,5,6
a,0,8,7,6,0,5
b,0,0,5,4,0,3
c,0,2,3,4,0,3
d,0,6,7,8,0,9
我希望删除总和(不包括列标题)为零的所有列。最快的方法是什么?我尝试通过分割每一行、将“ith”元素添加到列表中并求和来迭代整个过程。如果总和 == 0,则再次迭代数据并从每行中删除“第 i”个元素。这种方法的问题是它花费了不切实际的时间,并且我可能需要对几个类似的文件重复该过程。
我有一些 python 经验,但对 numpy 完全陌生。我不确定如何根据条件(例如 sum == 0)按列删除。到目前为止我已经:
data = np.loadtxt('test.csv', delimiter=',', skiprows=1, usecols=range(1,5))
我正在考虑使用类似的东西:
data = delete(data[:,i:])
但不知道如何检查列的总和 == 0 以及如何应用于整个数组。如果有人可以对此进行扩展或有更好的方法,请告诉我。谢谢
这是我的确切代码:
import numpy as np
with open('test.csv','r') as r:
all_data = [line.strip() for line in r]
titles = all_data[0].split(',')
samples = []
for i in all_data:
samples.append(i.split(',')[0])
print titles
print samples
data = np.loadtxt('test.csv', delimiter=',', skiprows=1, usecols=range(1,5))
print data
numeric_data = data[1:, 1:]
columns_to_keep = np.concatenate([[True], np.sum(numeric_data, axis = 0) != 0])
print columns_to_keep
new_data = data[:, columns_to_keep]
print new_data
这是输出:
['s', '1', '2', '3', '4', '5', '6']
['s', 'a', 'b', 'c', 'd']
[[ 0. 8. 7. 6.]
[ 0. 0. 5. 4.]
[ 0. 2. 3. 4.]
[ 0. 6. 7. 8.]]
[ True True True True]
[[ 0. 8. 7. 6.]
[ 0. 0. 5. 4.]
[ 0. 2. 3. 4.]
[ 0. 6. 7. 8.]]
我需要它,所以第一列被删除,因为它的总和是“0”
最佳答案
应该是这样的:
numeric_data = data[1:, 1:]
columns_to_keep = np.concatenate([[True], np.sum(numeric_data, axis = 0) != 0])
# Prepending True means you keep the first column
new_data = data[:, columns_to_keep])
关于python - 如果条件为真,则删除 numpy 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28730805/