Я хочу манипулировать данными текстового файла в MATLAB или Python. Мой файл данных содержит 3000 строк, но я разместил здесь только в качестве примера 4 строки данных. Файл данных содержит данные R, L, G, C для разных частот (здесь 3 частоты в 3 рядах). Теперь я хочу манипулировать данными в другом формате (скажем, целевой файл).
Теперь, кто-нибудь может мне помочь с тем, какая команда или команда цикла мне нужна для манипулирования данными для 3000 частот и в конце, чтобы сохранить их как новый целевой текстовый файл.
Файл данных:
FORMAT Freq R1:1 R1:2 R2:1 R2:2 L1:1 L1:2 L2:1 L2:2 G1:1 G1:2 G2:1 G2:2 C1:1 C1:2 C2:1 C2:2
0.00E+00 5.11E+00 7.13E-13 7.13E-13 5.11E+00 6.61E-07 4.46E-07 4.46E-07 6.61E-07 1.04E-17 -5.02E-18 -5.02E-18 1.04E-17 5.58E-11 -3.27E-11 -3.27E-11 5.58E-11
1.00E+06 5.59E+00 9.82E-03 9.82E-03 5.59E+00 6.97E-07 4.47E-07 4.47E-07 6.97E-07 6.42E-07 -3.11E-07 -3.11E-07 6.42E-07 5.54E-11 -3.25E-11 -3.25E-11 5.54E-11
2.00E+06 5.69E+00 2.47E-02 2.47E-02 5.69E+00 7.06E-07 4.48E-07 4.48E-07 7.06E-07 1.29E-06 -6.23E-07 -6.23E-07 1.29E-06 5.53E-11 -3.25E-11 -3.25E-11 5.53E-11
и целевой файл:
FORMAT Freq : R1:1 R1:2 R2:1 R2:2
L1:1 L1:2 L2:1 L2:2
G1:1 G1:2 G2:1 G2:2
C1:1 C1:2 C2:1 C2:2
0.00E+00 : 5.11E+00 7.13E-13 7.13E-13 5.11E+00
6.61E-07 4.46E-07 4.46E-07 6.61E-07
1.04E-17 -5.02E-18 -5.02E-18 1.04E-17
5.58E-11 -3.27E-11 -3.27E-11 5.58E-11
1.00E+06 : 5.59E+00 9.82E-03 9.82E-03 5.59E+00
6.97E-07 4.47E-07 4.47E-07 6.97E-07
6.42E-07 -3.11E-07 -3.11E-07 6.42E-07
5.54E-11 -3.25E-11 -3.25E-11 5.54E-11
2.00E+06 : 5.69E+00 2.47E-02 2.47E-02 5.69E+00
7.06E-07 4.48E-07 4.48E-07 7.06E-07
1.29E-06 -6.23E-07 -6.23E-07 1.29E-06
5.53E-11 -3.25E-11 -3.25E-11 5.53E-11
Я использую Anaconda (Spyder) для пакета python (который включает в себя python 3.6.4). Код выглядит так, как предложил @ xg.plt.py, что приводит к ошибке, поскольку данные хранятся в виде строк. Поэтому я попытался изменить тип данных по-разному, и это дает мне разные ошибки. Мой код указан ниже:
import pandas as pd
df = pd.read_csv('Data_file.txt')
#df = df.apply(pd.to_numeric, errors='ignore')
#df = df.apply(pd.to_numeric, errors='coerce')
#df = df.apply(pd.to_numeric)
#df = df.infer_objects()
df = df.astype(float)
formatters = {col : ('{:.2e}\n'.format if col[-3:]=='2:2' else '{:.2e}'.format) for col in df.columns}
formatters[df.columns[0]] = '{:.2e} : '.format
header_formatters = {col : ('{} \n'.format if col[-3:]=='2:2' else '{} '.format) for col in df.columns}
header_formatters[df.columns[0]] = '{} : '.format
f = open('formatted.txt','w')
f.write(''.join([header_formatters[col](col) for col in df.columns])+'\n')
df.to_string(buf=f,formatters=formatters,header=False,index=False)
f.close()
Если я не изменяю тип данных, это выдает ошибку, как показано ниже:
ValueError: Unknown format code 'e' for object of type 'str'
Если я использую df = df.apply(pd.to_numeric, errors='ignore')
или df = df.infer_objects()
, это выдает мне ту же ошибку, что и выше ValueError: Unknown format code 'e' for object of type 'str'
Если я использую df = df.apply(pd.to_numeric, errors='coerce')
, он запускается, но приводит к значению NaN в первом столбце и приводит к форматированному файлу, как показано ниже:
FORMAT Freq R1:1 R1:2 R2:1 R2:2 L1:1 L1:2 L2:1 L2:2 G1:1 G1:2 G2:1 G2:2 C1:1 C1:2 C2:1 C2:2 :
nan :
nan :
nan :
если я использую df = df.apply(pd.to_numeric)
, это выдаст мне следующую ошибку:
ValueError: ('Unable to parse string "0.00E+00\t5.11E+00\t7.13E-13\t7.13E-13\t5.11E+00\t6.61E-07\t4.46E-07\t4.46E-07\t6.61E-07\t1.04E-17\t-5.02E-18\t-5.02E-18\t1.04E-17\t5.58E-11\t-3.27E-11\t-3.27E-11\t5.58E-11" at position 0', 'occurred at index FORMAT Freq\tR1:1\tR1:2\tR2:1\tR2:2\tL1:1\tL1:2\tL2:1\tL2:2\tG1:1\tG1:2\tG2:1\tG2:2\tC1:1\tC1:2\tC2:1\tC2:2')
Когда я набираю df.dtypes
для проверки типа фрейма данных, он дает мне следующий результат:
FORMAT Freq\tR1:1\tR1:2\tR2:1\tR2:2\tL1:1\tL1:2\tL2:1\tL2:2\tG1:1\tG1:2\tG2:1\tG2:2\tC1:1\tC1:2\tC2:1\tC2:2 float64
dtype: object
если я использую df = df.astype(float)
, это выдаст мне следующую ошибку:
ValueError: could not convert string to float: '2.00E+06\t5.69E+00\t2.47E-02\t2.47E-02\t5.69E+00\t7.06E-07\t4.48E-07\t4.48E-07\t7.06E-07\t1.29E-06\t-6.23E-07\t-6.23E-07\t1.29E-06\t5.53E-11\t-3.25E-11\t-3.25E-11\t5.53E-11'