Манипулирование данными в MATLAB или Python - PullRequest
0 голосов
/ 11 мая 2018

Я хочу манипулировать данными текстового файла в 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'

1 Ответ

0 голосов
/ 11 мая 2018

Одним из вариантов является использование пакета python pandas.

Первым шагом будет загрузка данных в фрейм данных, т. Е. С pd.read_csv().pandas имеет обширный набор инструментов ввода / вывода .

Затем запишите кадр данных в файл.Поскольку целевой формат довольно необычен, лучше всего использовать функцию to_string с форматером по умолчанию:

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

Существует один форматер для числовых значений, а другой - для заголовка.Числовой форматер в основном говорит pandas записать числа в экспоненциальной записи с двумя десятичными позициями, и, если столбец заканчивается на '2:2', добавить после номера разрывную линию.Форматер заголовка просто имеет перерыв при желании.Оба пишут двоеточие после числа в первом столбце.См. PyFormat для получения дополнительной информации.

Затем можно открыть файл и записать в него отформатированную строку:

f = open('filename.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()

Сгенерированный filename.txt выглядит следующим образом:

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 
...