Python中的数据格式化和操作

Python中的数据格式化和操作,python,python-3.x,pandas,dataframe,data-manipulation,Python,Python 3.x,Pandas,Dataframe,Data Manipulation,我想将文本文件中的数据格式化为特定格式。我的数据文件包含120000多行,但我在这里发布了截断的数据。数据文件具有不同频率的R、L、G、C数据(此处为3行3个频率)。该文件只有两列,第一列是“Freq”,第二列是RLGC数据之一。现在我想将数据转换成另一种格式(比如target.txt)。以下是数据的来源。我想把它转换成目标文件 这是我的密码: import pandas as pd #create DataFrame from csv with columns f and v df = p

我想将文本文件中的数据格式化为特定格式。我的数据文件包含120000多行,但我在这里发布了截断的数据。数据文件具有不同频率的R、L、G、C数据(此处为3行3个频率)。该文件只有两列,第一列是“Freq”,第二列是RLGC数据之一。现在我想将数据转换成另一种格式(比如target.txt)。以下是数据的来源。我想把它转换成目标文件

这是我的密码:

import pandas as pd

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

#boolean mask for identify columns of new df   
m = df['v'].str.endswith('R', 'L', 'G', 'C')
#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()

df.columns = [x.replace('R','R1:1').replace('L','L1:1').replace('G','G1:1').replace('C','C1:1') for x in df.columns]
df.to_csv('target.txt', index=False, sep='\t')
但它给出了以下错误:

TypeError: wrapper3() takes from 2 to 3 positional arguments but 5 were given
有人能帮我把它格式化成目标文件吗

现在我需要目标文件以外的其他格式。我需要将格式设置为类似“”。这是另一种不寻常的格式,也是需要的。您可以看到,R1:1、L1:1、G1:1和C1:1数据现在看起来都像一个数组块(虽然不是数组)。如果仔细观察,对于
freq
,它应该命名为
FORMAT freq
,然后是
选项卡
,然后是
,然后是
选项卡
,然后是
R1:1
。如果您看到,它将类似于-
格式Freq+tab+:+tab+R1:1
。然后是一个
新行
,然后是
2个选项卡
,然后是
L1:1
。然后是一个
新行
,然后是
2个选项卡
,然后是
G1:1
。最后,对于
C1:1
也是一样的。之后是一个空行,接着是第一行数据、第二行数据并继续。数据值将根据标题行显示

如何创建第二个目标文件


我正在使用Spyder 3.2.6,其中嵌入了Python3.6.4 64位

我会使用如下常规字符串操作:

#open file
filename='data_in.txt'
file = open(filename,'r')
fileData=file.read()
file.close() 

#remove carriage returns
fileData=fileData.replace("\r","")


chunkNumber=0
data=[]

for chunk in fileData.split("\n\n\n"):
    chunkNumber+=1
    chunkType=chunk.split("\n")[0].split("\t")[1]
    firstData=["freq"]
    thisData=["%s:%s"%(chunkType,chunkNumber)]
    for line in chunk.split("\n")[1:]:
        entries=line.split("    ")
        thisData.append(entries[1])
        firstData.append(entries[0])
    data.append(thisData)
data=[firstData]+data

string=""
for j in range(5):
    for k in data:
        string+=k[j]+"\t"
    string=string[:-1]+"\n"

filename='output.txt'
file = open(filename,'w')
file.writelines(string)
file.close() 

我会使用常规的字符串操作,如:

#open file
filename='data_in.txt'
file = open(filename,'r')
fileData=file.read()
file.close() 

#remove carriage returns
fileData=fileData.replace("\r","")


chunkNumber=0
data=[]

for chunk in fileData.split("\n\n\n"):
    chunkNumber+=1
    chunkType=chunk.split("\n")[0].split("\t")[1]
    firstData=["freq"]
    thisData=["%s:%s"%(chunkType,chunkNumber)]
    for line in chunk.split("\n")[1:]:
        entries=line.split("    ")
        thisData.append(entries[1])
        firstData.append(entries[0])
    data.append(thisData)
data=[firstData]+data

string=""
for j in range(5):
    for k in data:
        string+=k[j]+"\t"
    string=string[:-1]+"\n"

filename='output.txt'
file = open(filename,'w')
file.writelines(string)
file.close() 

在进行一些初始清理后,您可以使用
pivot
执行此操作

import pandas as pd
df = pd.read_table('data_in.txt', sep='\s+', names=['freq','v'])

# Determine where `'freq'` occurs
mask = df.freq == 'freq'

# Create the column headers you want for each measurement
df.loc[mask, 'col_names'] = df.loc[mask, 'v']
df['col_names'] = df.col_names.ffill() + '1:1'

# Pivot to desired output
df = df.loc[~mask].pivot(index = 'freq', 
                         columns ='col_names', 
                         values = 'v').reset_index()
df.columns.name=None
df = df.astype('float')
输出:

        freq          C1:1          G1:1          L1:1      R1:1
0        0.0  1.580132e-10  2.763283e-16  2.997629e-07  2.661409
1  1000000.0  1.459912e-10  1.716549e-05  3.096696e-07  2.892461
2  2000000.0  1.447848e-10  3.434434e-05  3.130131e-07  2.981991
3  3000000.0  1.440792e-10  5.152409e-05  3.151563e-07  3.066247

在进行一些初始清理后,您可以使用
pivot
执行此操作

import pandas as pd
df = pd.read_table('data_in.txt', sep='\s+', names=['freq','v'])

# Determine where `'freq'` occurs
mask = df.freq == 'freq'

# Create the column headers you want for each measurement
df.loc[mask, 'col_names'] = df.loc[mask, 'v']
df['col_names'] = df.col_names.ffill() + '1:1'

# Pivot to desired output
df = df.loc[~mask].pivot(index = 'freq', 
                         columns ='col_names', 
                         values = 'v').reset_index()
df.columns.name=None
df = df.astype('float')
输出:

        freq          C1:1          G1:1          L1:1      R1:1
0        0.0  1.580132e-10  2.763283e-16  2.997629e-07  2.661409
1  1000000.0  1.459912e-10  1.716549e-05  3.096696e-07  2.892461
2  2000000.0  1.447848e-10  3.434434e-05  3.130131e-07  2.981991
3  3000000.0  1.440792e-10  5.152409e-05  3.151563e-07  3.066247

您不能以这种方式使用
str.endswith
。对于您似乎在寻找的内容,我想说
str.contains
是一个更好的解决方案,您可以在其中查找R或L或。。。例如:

m = df['v'].str.contains('R|L|G|C')
然后将代码保存到
pivot
。我在
pivot
行中发现一个错误,该错误是由
nan
行引起的,因此您可能需要
dropna
,您可以
同时重命名列:

df = (df.dropna().pivot('freq', 'g', 'v').rename_axis(None, axis=1)
        .reindex(columns=cols).reset_index()
        .rename(columns={col:'{}1:1'.format(col) for col in cols}))
df
看起来像:

       freq      R1:1      L1:1      G1:1      C1:1
0  0.00E+00  2.66E+00  3.00E-07  2.76E-16  1.58E-10
1  1.00E+06  2.89E+00  3.10E-07  1.72E-05  1.46E-10
2  2.00E+06  2.98E+00  3.13E-07  3.43E-05  1.45E-10
3  3.00E+06  3.07E+00  3.15E-07  5.15E-05  1.44E-10

您不能以这种方式使用
str.endswith
。对于您似乎在寻找的内容,我想说
str.contains
是一个更好的解决方案,您可以在其中查找R或L或。。。例如:

m = df['v'].str.contains('R|L|G|C')
然后将代码保存到
pivot
。我在
pivot
行中发现一个错误,该错误是由
nan
行引起的,因此您可能需要
dropna
,您可以
同时重命名列:

df = (df.dropna().pivot('freq', 'g', 'v').rename_axis(None, axis=1)
        .reindex(columns=cols).reset_index()
        .rename(columns={col:'{}1:1'.format(col) for col in cols}))
df
看起来像:

       freq      R1:1      L1:1      G1:1      C1:1
0  0.00E+00  2.66E+00  3.00E-07  2.76E-16  1.58E-10
1  1.00E+06  2.89E+00  3.10E-07  1.72E-05  1.46E-10
2  2.00E+06  2.98E+00  3.13E-07  3.43E-05  1.45E-10
3  3.00E+06  3.07E+00  3.15E-07  5.15E-05  1.44E-10

ffill
:)+1阅读过程中,重命名即将成为列名的内容是个好主意。它也起了作用。我已经更新了问题的另一个不寻常的格式,这是最重要的。你能查一下吗?我也上传了第二个目标文件。在
ffill
:)+1感谢期间重命名将要成为列名的内容是个好主意。它也起了作用。我已经更新了问题的另一个不寻常的格式,这是最重要的。你能查一下吗?我也上传了第二个目标文件。非常感谢。成功了。我已经更新了问题的另一个不寻常的格式,这是最重要的。你能查一下吗?我也上传了第二个目标文件。它工作了,但是当我的数据足够大,并且数据之间的步长在减小时,数据在新的数据帧中保存时不是单调的。我提出了另一个问题。你能看看吗?这是感谢信,非常感谢。成功了。我已经更新了问题的另一个不寻常的格式,这是最重要的。你能查一下吗?我也上传了第二个目标文件。它工作了,但是当我的数据足够大,并且数据之间的步长在减小时,数据在新的数据帧中保存时不是单调的。我提出了另一个问题。你能看看吗?这是你的电话号码