将file.txt内容转换为熊猫中的df

时间:2020-09-20 14:24:51

标签: python pandas

我需要帮助才能将文件内容转换为熊猫数据框。

这是文件:

>OK0100087.1
0 375
376 750
751 1000
>OK0100088.1
0 87766
>OK0100089.1
0 66778
>OK0100090.1
0 47519
47520 73733

并且想法是我想在df中更改此文件内容,例如:

Name           start end
OK0100087.1_0  0      375
OK0100087.1_1  376    750
OK0100087.1_2  751    1000
OK0100088.1    0      87766
OK0100089.1    0      66778
OK0100090.1_0  0      47519
OK0100090.1_1  47520  73733

如果在>OK...number之后有几行,我会在其中添加_Number

,其中每行的开头是第一个数字,结尾是最后一个。

有人有主意吗?

2 个答案:

答案 0 :(得分:1)

您可以准备数据,以便轻松将其加载到数据框中。

import pandas as pd

records = []

with open('f.txt', 'r') as f:
    idx = None
    for line in f.readlines():
        if line.startswith('>OK'):
            idx = line.strip()[1:]
        else:
            start, end = line.strip().split()
            records.append({
                'start': start,
                'end': end,
                'Name': idx
            })

df = pd.DataFrame.from_records(records)

答案 1 :(得分:1)

这不是很简单,因为当一个有多个数据时,您需要增加键(这至少需要读取足够多的行才能找到新的>或文件结尾。

  1. 愚蠢地读取数据
  2. 然后将其转换为记录
  3. 完成后将其设为数据框

如何编写:

import pandas as pd

DATA_FILE = 'data.txt'


def read_file(filename):
    data = {}
    current_key = None
    with open(filename) as f:
        for line in f:
            if line.startswith('>'):
                current_key = line.strip()[1:]
                data[current_key] = []
            elif current_key:
                data[current_key].append([int(i) for i in line.split(' ')])
    return data


def prepare_data(data):
    records = []
    for key in data:
        if len(data[key]) > 1:
            # case where a key have multiple lines (we add a suffix)
            for i, d in enumerate(data[key]):
                records.append({
                    'name': '{}_{}'.format(key, i),
                    'start': d[0],
                    'end': d[1]})
        elif len(data[key]) == 1:
            # otherwise no suffix needed
            records.append({
                'name': key,
                'start': data[key][0][0],
                'end': data[key][0][1]})
    return records


def main():
    data = read_file(DATA_FILE)
    records = prepare_data(data)
    df = pd.DataFrame(records)
    print(df)


if __name__ == '__main__':
    main()