我有一个大的csv文件5300列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'元素添加到列表中并求和。如果sum == 0则再次迭代数据并从每行中删除'ith'元素。这种方法的问题是它花费了不切实际的时间,我可能需要为几个类似的文件重复该过程。
我有一些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'
答案 0 :(得分:4)
应该是这样的:
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])
答案 1 :(得分:0)
如果有人对如何将其扩展到具有两个以上维度的数组感兴趣,则完成此任务的更简化的方法如下:
假设数组是一个三维数组(例如时间,纬度,经度),并且某些时间步长对于所有纬度和经度都具有零值,并且您希望删除这些时间步长。
new_data = data[data.sum(axis=(1,2))>0]