Форматирование данных в питоне

Я хочу отформатировать данные в кадр данных или файл с определенным форматом. Я извлек данные из ADS Keysight. Но структура данных непригодна для дальнейшей обработки. Файл данных имеет от R(1,1) до R(2,2), от L(1,1) до L(2,2), от G(1,1) до G(2,2), C(1, 1) в данные C(2,2) для разных частот. В файле всего 2 столбца. 1-й столбец — «Частота», а 2-й столбец — либо одно из данных RLGC. Я привел здесь пример только для 3 частот для каждого из данных. И целевой формат тоже.

Реальный файл содержит 3000 частот данных.

Файл данных (два столбца разделены табуляцией):

freq    R(1,1)
0.00E+00    5.11E+00
1.00E+06    5.59E+00
2.00E+06    5.69E+00


freq    R(1,2)
0.00E+00    7.13E-13
1.00E+06    9.82E-03
2.00E+06    2.47E-02


freq    R(2,1)
0.00E+00    7.13E-13
1.00E+06    9.82E-03
2.00E+06    2.47E-02


freq    R(2,2)
0.00E+00    5.11E+00
1.00E+06    5.59E+00
2.00E+06    5.69E+00


freq    L(1,1)
0.00E+00    6.61E-07
1.00E+06    6.97E-07
2.00E+06    7.06E-07


freq    L(1,2)
0.00E+00    4.46E-07
1.00E+06    4.47E-07
2.00E+06    4.48E-07


freq    L(2,1)
0.00E+00    4.46E-07
1.00E+06    4.47E-07
2.00E+06    4.48E-07


freq    L(2,2)
0.00E+00    6.61E-07
1.00E+06    6.97E-07
2.00E+06    7.06E-07


freq    G(1,1)
0.00E+00    1.04E-17
1.00E+06    6.42E-07
2.00E+06    1.29E-06


freq    G(1,2)
0.00E+00    -5.02E-18
1.00E+06    -3.11E-07
2.00E+06    -6.23E-07


freq    G(2,1)
0.00E+00    -5.02E-18
1.00E+06    -3.11E-07
2.00E+06    -6.23E-07


freq    G(2,2)
0.00E+00    1.04E-17
1.00E+06    6.42E-07
2.00E+06    1.29E-06


freq    C(1,1)
0.00E+00    5.58E-11
1.00E+06    5.54E-11
2.00E+06    5.53E-11


freq    C(1,2)
0.00E+00    -3.27E-11
1.00E+06    -3.25E-11
2.00E+06    -3.25E-11


freq    C(2,1)
0.00E+00    -3.27E-11
1.00E+06    -3.25E-11
2.00E+06    -3.25E-11


freq    C(2,2)
0.00E+00    5.58E-11
1.00E+06    5.54E-11
2.00E+06    5.53E-11

Целевой файл должен выглядеть так, как показано ниже (столбцы также разделены табуляцией):

freq    R(1,1)  R(1,2)  R(2,1)  R(2,2)  L(1,1)  L(1,2)  L(2,1)  L(2,2)  G(1,1)  G(1,2)  G(2,1)  G(2,2)  C(1,1)  C(1,2)  C(2,1)  C(2,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

Целевым форматом может быть фрейм данных в python, которым я могу манипулировать дальше. Но может ли кто-нибудь помочь мне, как это сделать с пандами?

Я использую Anaconda (Spyder) для пакета Python (который включает Python 3.6.4).


person aguntuk    schedule 30.06.2018    source источник


Ответы (1)


Использовать:

#create DataFrame from csv with columns f and v 
df = pd.read_csv(filename, sep="\s+", names=['freq','v'])

#boolean mask for identify columns of new df   
m = df['v'].str.endswith(')')
#new column by replace NaNs by forward filling
df['g'] = df['v'].where(m).ffill()
#get original ordering for new columns
cols = df['g'].unique()
#remove rows with same values in v and g columns
df = df[df['v'] != df['g']]
#reshape by pivoting with change ordering of columns by reindex
df = df.pivot('freq', 'g', 'v').rename_axis(None, axis=1).reindex(columns=cols).reset_index()
print (df)
       freq    R(1,1)    R(1,2)    R(2,1)    R(2,2)    L(1,1)    L(1,2)  \
0  0.00E+00  5.11E+00  7.13E-13  7.13E-13  5.11E+00  6.61E-07  4.46E-07   
1  1.00E+06  5.59E+00  9.82E-03  9.82E-03  5.59E+00  6.97E-07  4.47E-07   
2  2.00E+06  5.69E+00  2.47E-02  2.47E-02  5.69E+00  7.06E-07  4.48E-07   

     L(2,1)    L(2,2)    G(1,1)     G(1,2)     G(2,1)    G(2,2)    C(1,1)  \
0  4.46E-07  6.61E-07  1.04E-17  -5.02E-18  -5.02E-18  1.04E-17  5.58E-11   
1  4.47E-07  6.97E-07  6.42E-07  -3.11E-07  -3.11E-07  6.42E-07  5.54E-11   
2  4.48E-07  7.06E-07  1.29E-06  -6.23E-07  -6.23E-07  1.29E-06  5.53E-11   

      C(1,2)     C(2,1)    C(2,2)  
0  -3.27E-11  -3.27E-11  5.58E-11  
1  -3.25E-11  -3.25E-11  5.54E-11  
2  -3.25E-11  -3.25E-11  5.53E-11 

Последнее для удаления значений индекса в выходном csv с помощью to_csv используйте параметр index=False:

df.to_csv(file, index=False, sep='\t')
person jezrael    schedule 30.06.2018
comment
большое спасибо. Целевой df должен быть другим, как я указал в вопросе. df, который он создает, содержит множество массивов данных. Вы можете это проверить? - person aguntuk; 30.06.2018
comment
Вы можете проверить решение сейчас? - person jezrael; 30.06.2018
comment
кадр данных, который он создает, имеет несколько массивов переменных параметров R, L, G, C, но он должен быть в одном кадре данных из нескольких переменных RLGC. Вы видите целевой кадр данных, который я разместил в вопросе? Другое дело, что у нового фрейма данных в начале есть лишний столбец с номерами строк, номера строк тоже нужно убрать. - person aguntuk; 30.06.2018
comment
это все равно. есть ` which is creating the new line but it should be the continuation like freq R(1,1) R(1,2) R(2,1) R(2,2) L(1,1) L(1,2) L(2,1) L(2,2) ) G(1,1) G(1,2) G(2,1) G(2,2) C(1,1) C(1,2) C(2,1) C(2,2)` - person aguntuk; 30.06.2018
comment
если я хочу писать в файл, то после f = open('new_file_name.csv','w')? - person aguntuk; 30.06.2018
comment
тогда используйте df.to_csv(f, index=False), но лучше df.to_csv('new_file_name.csv', index=False) - person jezrael; 30.06.2018
comment
жаль, что я пропустил это. Теперь он работает в файле. 3 проблемы в csv. 1) вывод разделен запятыми, может ли он быть разделен TAB при записи в файл ?? 2) В заголовке вывода есть знак кавычек в strings"C(1,1)" как это убрать. 3) Порядок в файле, который он сохраняет в столбце, алфавитный. если я хочу сохранить способ, которым я поставил цель (если вы видите вопрос). Вывод в csv в текстовом редакторе: freq,"C(1,1)","C(1,2)","C(2,1)","C(2,2)","G(1,1)","G(1,2)","G(2,1)","G(2,2)","L(1,1)","L(1,2)","L(2,1)","L(2,2)","R(1,1)","R(1,2)","R(2,1)","R(2,2)" - person aguntuk; 30.06.2018
comment
@aguntuk - Проверьте отредактированный ответ - нужно df.to_csv('new_file_name.csv', index=False, sep='\t') и для изменения порядка столбцов reindex например df = df.pivot('freq', 'g', 'v').rename_axis(None, axis=1).reindex(columns=cols).reset_index() - person jezrael; 01.07.2018