格式化 python 中的数据
Formatting data in python
我想将数据格式化为特定格式的数据框或文件。我已经从 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 列,第一列是 "Freq",第二列是 RLGC 数据之一。我在这里给出了一个例子,每个数据只有 foe 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 中的数据框,我可以进一步操作。但是谁能帮助我如何使用 pandas 来做到这一点?
我正在为 python 包(包括 python 3.6.4)使用 Anaconda (Spyder)。
使用:
#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
最后通过 to_csv
使用 index=False
参数删除输出 csv 中的索引值:
df.to_csv(file, index=False, sep='\t')
我想将数据格式化为特定格式的数据框或文件。我已经从 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 列,第一列是 "Freq",第二列是 RLGC 数据之一。我在这里给出了一个例子,每个数据只有 foe 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 中的数据框,我可以进一步操作。但是谁能帮助我如何使用 pandas 来做到这一点?
我正在为 python 包(包括 python 3.6.4)使用 Anaconda (Spyder)。
使用:
#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
最后通过 to_csv
使用 index=False
参数删除输出 csv 中的索引值:
df.to_csv(file, index=False, sep='\t')