如何在Python中对忽略nan的数组进行列堆栈?
我有一个文本文件中的表格数据 文本文件条目如何在Python中对忽略nan的数组进行列堆栈?,python,arrays,numpy,pandas,nan,Python,Arrays,Numpy,Pandas,Nan,我有一个文本文件中的表格数据 文本文件条目 #x y z 1 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 512 9 81 729 10 100 1000 11 121 12 144 1728 13 169 14 196 15 225 16 256 4096 17 289 18 324 19 361 6859 20 400 21 441 9261 22
#x y z
1 1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64 512
9 81 729
10 100 1000
11 121
12 144 1728
13 169
14 196
15 225
16 256 4096
17 289
18 324
19 361 6859
20 400
21 441 9261
22 484
23 529 12167
24 576
25 625
第三列中的某些条目为空。我试图创建一个x(第1列)和z(第3列)的数组。设数组为B。B的内容应为:
1 1
8 512
9 729
10 1000
12 1728
16 4096
19 6859
21 9261
23 12167
我尝试使用以下代码执行此操作:
import numpy as np
A = np.genfromtxt('data.dat', comments='#', delimiter='\t')
B = []
for i in range(len(A)):
if ~ np.isnan(A[i, 2]):
B = np.append(B, np.column_stack((A[i, 0], A[i, 2])))
print B.shape
这是行不通的。它创建一个列向量。在Python中如何实现这一点?如果读取
data.dat
文件并将内容分配给变量,比如data
:
您可以迭代这些行并拆分它们,只处理包含3个元素的行:
B=[]
for line in data.split('\n'):
if len(line.split()) == 3:
x,y,z = line.split()
B.append((x,z)) # or B.append(str(x)+'\t'+str(z)+'\n')
# or any othr format you need
正如您所发现的,库提供的函数并不总是易于使用的。下面的程序手动执行此操作,并使用数据文件中的值创建一个数组
import numpy as np
def main():
B = np.empty([0, 2], dtype = int)
with open("data.dat") as inf:
for line in inf:
if line[0] == "#": continue
l = line.split()
if len(l) == 3:
l = [int(d) for d in l[1:]]
B = np.vstack((B, l))
print B.shape
print B
return 0
if __name__ == '__main__':
main()
请注意:
1) append()
函数在列表上工作,而不是在数组上-至少在您使用的语法中不是这样。扩展数组的最简单方法是“堆积”行,使用vstack
(或hstack
列)
2) 在
genfromtxt()
中指定一个分隔符可能会对您产生不利影响。默认情况下,分隔符是任何空白,这通常是您想要的。使用pandas
将使您的生活更加轻松(请注意定义分隔符的正则表达式):
其结果是:
array([[ 8.00000000e+00, 5.12000000e+02],
[ 9.00000000e+00, 7.29000000e+02],
[ 1.00000000e+01, 1.00000000e+03],
[ 1.20000000e+01, 1.72800000e+03],
[ 1.60000000e+01, 4.09600000e+03],
[ 1.90000000e+01, 6.85900000e+03],
[ 2.10000000e+01, 9.26100000e+03],
[ 2.30000000e+01, 1.21670000e+04]])
从输入数据帧:
In [33]: df.head()
Out[33]:
x y z
0 1 1 1
1 2 4 NaN
2 3 9 NaN
3 4 16 NaN
4 5 25 NaN
。。您可以通过以下操作获得输出数据帧B:
In [34]: df.dropna().head().drop('y', axis=1)
Out[34]:
x z
0 1 1
7 8 512
8 9 729
9 10 1000
11 12 1728
如果您要处理数据分析,Pandas
将使使用pd.read\u table(file).dropna()
此处pd.read\u table(file)
读取文件和dropna()
dropsNA行的工作更轻松。
In [34]: df.dropna().head().drop('y', axis=1)
Out[34]:
x z
0 1 1
7 8 512
8 9 729
9 10 1000
11 12 1728