Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中对忽略nan的数组进行列堆栈?_Python_Arrays_Numpy_Pandas_Nan - Fatal编程技术网

如何在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()
drops
NA行的工作更轻松。
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