我需要帮助才能将文件内容转换为熊猫数据框。
这是文件:
>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
,其中每行的开头是第一个数字,结尾是最后一个。
有人有主意吗?
答案 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)
这不是很简单,因为当一个有多个数据时,您需要增加键(这至少需要读取足够多的行才能找到新的>
或文件结尾。
如何编写:
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()