使用特定列将.txt文件转换为.csv

时间:2020-10-27 17:52:45

标签: python pandas csv txt

我有一些文本文件要加载到我的python代码中,但是txt文件的格式不合适。

这里是其中包含的内容:

SEQ  MSSSSWLLLSLVAVTAAQSTIEEQAKTFLDKFNHEAEDLFYQSSLASWNY
SS3  CCCHHHHHHHHHHHHCCCCCCHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     95024445656543114678678999999999999999888889998886
SS8  CCHHHHHHHHHHHHHHCCCCCHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     96134445555554311253378999999999999999999999999987
SA   EEEbBBBBBBBBBBbEbEEEeeEeBeEbBEEbbEeBeEbbeebBbBbBbb
     41012123422000000103006262214011342311110000030001
TA   bhHHHHHHHHHHHHHgIihiHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     00789889988663201010099999999999999999898999998741
CD   NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
     54433221111112221122124212411342243234323333333333

我想将其转换为panda数据帧,以将SEQ SS4 SA TA CD SS8作为数据帧的列,并将其旁边的行作为行。 像这样:enter image description here

我尝试了pd.read_csv,但没有得到想要的结果。

谢谢!

3 个答案:

答案 0 :(得分:1)

步骤

  1. 使用pd.read_fwf()读取固定宽度格式的文件。
  2. df.ffill()用最后一个可用值填充缺失值。
  3. 使用groupby-cumcount构造为输出中的行号分配组号gp。
  4. 将gp =(0,1)移动到df.pivot的列中,然后再次转置到所需的输出中。

注意:此解决方案适用于第一列中包含省略值的任意连续行(包括零,当然也不要太多)。

代码

# data (3 characters for the second column only)
file_path = "/mnt/ramdisk/input.txt"
df = pd.read_fwf(file_path, names=["col", "val"])

# fill the blank values
df["col"].ffill(inplace=True)
# get correct row location
df["gp"] = df.groupby("col").cumcount()
# pivot group (0,1) to columns and then transpose. 
df_ans = df.pivot(index="col", columns="gp", values="val").transpose()

结果

print(df_ans)  # show the first 3 characters only

col   CD   SA  SEQ  SS3  SS8   TA
gp                               
0    NNN  EEE  MSS  CCC  CCH  bhH
1    544  410  NaN  950  961  007

然后,您可以使用df_ans.to_csv()保存结果DataFrame。

答案 1 :(得分:1)

要使用pandas.read_csv()方法读取文本文件,则该文本文件应包含用逗号分隔的数据。

 SEQ, SS3, ....
 MSSSSWLLLSLVAVTAAQSTIEEQ..., CCCHHHHHHHHHHHHCCCCCCHHHHHHH.....

答案 2 :(得分:0)

您可以使用此脚本将.txt文件加载到DataFrame并将其另存为csv文件:

import pandas as pd


data = {}
with open('<your file.txt>', 'r') as f_in:
    for line in f_in:
        line = line.split()        
        if len(line) == 2:
            data[line[0]] = [line[1]]

df = pd.DataFrame(data)
print(df)
df.to_csv('data.csv', index=False)

保存此CSV:

enter image description here