python将非正式复数文件转换为正式的幅度数据

时间:2016-11-04 06:54:16

标签: python pandas numpy

我有一个由90组运营商数据组成的txt文件,这些数据由一个新行分隔。每个载体数据由200个复数组成,由选项卡分隔 我想要的只是一个90 * 200的数组,每个都是复数的幅度。我怎样才能读取文件并进行转换?

2 个答案:

答案 0 :(得分:0)

你的意思是?

result = []
file = open('yourfile.txt')
for line in file.readlines():
    result.append(line.split())

file.close()
print(result)

答案 1 :(得分:0)

您可以使用read_csv参数skip_blank_lines来获取群组:

import pandas as pd
import numpy as np
from pandas.compat import StringIO

temp=u"""
7+3j;2+1j
1+6j;5+1j

8+3j;1+7j
5+4j;4+1j

6+2j;2+1j
8+4j;9+3j
"""
#after testing replace StringIO(temp) to filename
df = pd.read_csv(StringIO(temp), 
                 sep=";", #in real data use sep='\t'
                 skip_blank_lines=False, 
                 names=np.arange(2)) #in real data use 200
print (df)
      0     1
0   NaN   NaN
1  7+3j  2+1j
2  1+6j  5+1j
3   NaN   NaN
4  8+3j  1+7j
5  5+4j  4+1j
6   NaN   NaN
7  6+2j  2+1j
8  8+4j  9+3j

通过iloc选择第一列创建索引,按isnull获取掩码,然后应用cumsum - 在index中创建具有相同值的组:

df.index = df.iloc[:, 0].isnull().cumsum()

然后按dropna删除第一列中NaN的所有行:

df = df.dropna(subset=[0])

转换为complex并按numpy.angle获得幅度:

df = df.applymap(lambda x: np.angle(np.complex(x)))
print (df)
          0         1
0                    
1  0.404892  0.463648
1  1.405648  0.197396
2  0.358771  1.428899
2  0.674741  0.244979
3  0.321751  0.463648
3  0.463648  0.321751

按索引提交groupby并按values转换为numpy数组:

print (df.groupby(level=0).apply(lambda x: x.values).values)
[array([[ 0.40489179,  0.46364761],
       [ 1.40564765,  0.19739556]])
 array([[ 0.35877067,  1.42889927],
       [ 0.67474094,  0.24497866]])
 array([[ 0.32175055,  0.46364761],
       [ 0.46364761,  0.32175055]])]

如果不需要群组,请使用:

import pandas as pd
import numpy as np
from pandas.compat import StringIO

temp=u"""
7+3j;2+1j
1+6j;5+1j

8+3j;1+7j
5+4j;4+1j

6+2j;2+1j
8+4j;9+3j
"""
#after testing replace StringIO(temp) to filename
df = pd.read_csv(StringIO(temp), 
                 sep=";", #in real data use sep='\t'
                 names=np.arange(2)) #in real data use 200
print (df)
      0     1
0  7+3j  2+1j
1  1+6j  5+1j
2  8+3j  1+7j
3  5+4j  4+1j
4  6+2j  2+1j
5  8+4j  9+3j
df = df.applymap(lambda x: np.angle(np.complex(x)))
print (df)

          0         1
0  0.404892  0.463648
1  1.405648  0.197396
2  0.358771  1.428899
3  0.674741  0.244979
4  0.321751  0.463648
5  0.463648  0.321751

print (df.values)
[[ 0.40489179  0.46364761]
 [ 1.40564765  0.19739556]
 [ 0.35877067  1.42889927]
 [ 0.67474094  0.24497866]
 [ 0.32175055  0.46364761]
 [ 0.46364761  0.32175055]]