将数据从.data文件转换为.csv文件,然后使用pandas将数据放入列中

Mot*_*mbo 4 python csv pandas

我想将数据从.data文件转换为.csv文件,并将来自.data文件的数据放入其下具有值的列中。但是,.data文件具有特定的格式,我不知道如何将文本放在各列中。.data文件的外观如下:

column1  
column2  
column3  
column4  
column5  
column6  
column7  
column8  
column9  
column10  
column11  
column12  
column13  
........
column36

1243;6543;5754;5678;4567;4567;4567;2573;7532;6332;6432;6542;5542;7883;7643;4684;4568;4573  
3567;5533;6532;6432;7643;8635;7654;6543;8753;7643;7543;7543;7543;6543;6444;7543;6444;6444  

1243;6543;5754;5678;4567;4567;4567;2573;7532;6332;6432;6542;5542;7883;7643;4684;4568;4573  
3567;5533;6532;6432;7643;8635;7654;6543;8753;7643;7543;7543;7543;6543;6444;7543;6444;6444  

1243;6543;5754;5678;4567;4567;4567;2573;7532;6332;6432;6542;5542;7883;7643;4684;4568;4573  
3567;5533;6532;6432;7643;8635;7654;6543;8753;7643;7543;7543;7543;6543;6444;7543;6444;6444  

1243;6543;5754;5678;4567;4567;4567;2573;7532;6332;6432;6542;5542;7883;7643;4684;4568;4573  
3567;5533;6532;6432;7643;8635;7654;6543;8753;7643;7543;7543;7543;6543;6444;7543;6444;6444
Run Code Online (Sandbox Code Playgroud)

上面显示的文件具有36列的名称,每列1行。在这些之下有许多数据点,其中有36个值,以分号分隔。数据点长2行,每个数据点用空白行分隔。.csv文件必须如下所示:

column1,column2,column3,column4,column5,column6,column7,column8,column9,column10,column11,column12,column14,column15,column16,column17,column18,column20,column20,column21,column22,column23,column24,column25,column26,column27,column28,column29,column30,column31,column32,column33,column34,column35,column36
1243,6543,5754,5678,4567,4567,4567,2573,7532,6332,6432,6542,5542,7883,7643,4684,4568,4573,3567,5533,6532,6432,7643,8635,7654,6543,8753,7643,7543,7543,7543,6543,6444,7543,6444,6444
1243,6543,5754,5678,4567,4567,4567,2573,7532,6332,6432,6542,5542,7883,7643,4684,4568,4573,3567,5533,6532,6432,7643,8635,7654,6543,8753,7643,7543,7543,7543,6543,6444,7543,6444,6444
1243,6543,5754,5678,4567,4567,4567,2573,7532,6332,6432,6542,5542,7883,7643,4684,4568,4573,3567,5533,6532,6432,7643,8635,7654,6543,8753,7643,7543,7543,7543,6543,6444,7543,6444,6444
1243,6543,5754,5678,4567,4567,4567,2573,7532,6332,6432,6542,5542,7883,7643,4684,4568,4573,3567,5533,6532,6432,7643,8635,7654,6543,8753,7643,7543,7543,7543,6543,6444,7543,6444,6444
Run Code Online (Sandbox Code Playgroud)

如上文件所示,.csv的第一行必须由36列组成,其中的名称用逗号分隔。接下来的行必须由所有数据点组成,每个数据点都在一行上,并且其中的36个值必须用逗号分隔。

您可以为此使用软件库“ pandas”吗?无论如何,这是我的起始代码:

with open("file.data") as fIn, open("file.csv", "w") as fOut:
    for r, line in enumerate(fIn):
        if not line:
            break
Run Code Online (Sandbox Code Playgroud)

谢谢

9do*_*ogs 5

当然可以用熊猫做。您只需要读取第一N行(在您的情况下为36行)即可将它们用作标头,并像普通的csv一样读取文件的其余部分(擅长使用熊猫)。然后,您可以将pandas.DataFrame对象保存到csv。

由于您的数据已拆分为相邻的行,因此我们应该将已读取的DataFrame拆分为两行,并将它们一个接一个地堆叠(水平放置)。

考虑以下代码:

import pandas as pd

COLUMNS_COUNT = 36
# read first `COLUMNS_COUNT` lines to serve as a header
with open('data.data', 'r') as f:
    columns = [next(f).strip() for line in range(COLUMNS_COUNT)]
# read rest of the file to temporary DataFrame
temp_df = pd.read_csv('data.data', skiprows=COLUMNS_COUNT, header=None, delimiter=';', skip_blank_lines=True)
# split temp DataFrame on even and odd rows
even_df = temp_df.iloc[::2].reset_index(drop=True)
odd_df = temp_df.iloc[1::2].reset_index(drop=True)
# stack even and odd DataFrames horizontaly
df = pd.concat([even_df, odd_df], axis=1)
# assign column names
df.columns = columns
# save result DataFrame to csv
df.to_csv('out.csv', index=False)
Run Code Online (Sandbox Code Playgroud)

UPD:更新了代码以正确处理分为两行的数据