#python #python-3.x #pandas #csv
#python #python-3.x #панды #csv
Вопрос:
У меня есть огромный набор данных, который устроен следующим образом. Каждый идентификатор соответствует уникальному набору групп.
0
0 0
NUMBER 22 ADD_FLD 5 15 amp;11111
ID 382 START_TIME 2001052306
POINT 63
2010052306 119.464119 15.870264 1.682708e 00 amp; 1.213053
2010052312 119.910667 15.874892 1.934127e 00 amp; 1.221175
2010052318 120.368523 16.022879 2.260490e 00 amp; 1.227459
2010052400 120.611115 15.788021 2.787007e 00 amp; 1.229084
2010052406 121.286072 15.984570 3.253321e 00 amp; 1.230381
ID 413 START_TIME 2010061006
POINT 40
2010061006 156.424057 5.559299 1.059667e 00 amp; 1.578506
2010061012 153.899506 6.450210 1.150635e 00 amp; 1.516614
2010061018 152.346802 7.281753 1.187466e 00 amp; 1.501871
Что я хотел бы сделать, так это переставить их в это.
ID YR MONTH DAY HR LON LAT RESULT1 RESULT2
382 2010 05 23 06 119.464119 15.870264 1.682708e 00 1.213053
382 2010 05 23 12 119.910667 15.874892 1.934127e 00 1.221175
382 2010 05 23 18 120.368523 16.022879 2.260490e 00 1.227459
382 2010 05 24 00 120.611115 15.788021 2.787007e 00 1.229084
382 2010 05 24 06 121.286072 15.984570 3.253321e 00 1.230381
413 2010 06 10 06 156.424057 5.559299 1.059667e 00 1.578506
413 2010 06 10 12 153.899506 6.450210 1.150635e 00 1.516614
413 2010 06 10 18 152.346802 7.281753 1.187466e 00 1.501871
Столбец ID основан на соответствующем уникальном идентификаторе, назначенном для каждой группы. ГОД, МЕСЯЦ, ДЕНЬ и ЧАС основаны на первом столбце входных данных.
Я был бы признателен за любую помощь. Спасибо
Комментарии:
1. Не могли бы вы подробнее рассказать? Совсем не очевидно, как вы добираетесь до столбцов вывода. Если возможно, это может помочь показать воспроизводимый минимальный пример, который проще.
Ответ №1:
Я потратил на это некоторое время, надеюсь, это поможет 🙂
t=open('your_file.txt').read() #or your_file.csv'
l=t.split('n')
l=l[3:]
l=[i for i in l if i[:5] not in ('POINT', '')]
d={}
current_key=0
for i in range(len(l)):
if l[i][:2]=='ID':
current_key=l[i].split(' ')[2]
d[current_key]=[]
else:
d[current_key].append(l[i])
for i in d:
for k in range(len(d[i])):
s=d[i][k]
s=s.split(' ')
s=[p for p in s if p not in ('amp;', '')]
s=[s[0][:4]] [s[0][4:6]] [s[0][6:8]] [s[0][8:]] s[1:]
d[i][k]=[i] s
rows=sum(d.values(), [])
columns=['ID','YR','MONTH','DAY','HR','LON','LAT','RESULT1','RESULT2']
result=pd.DataFrame(rows, columns=columns)
print(result)
Вывод:
ID YR MONTH DAY HR LON LAT RESULT1 RESULT2
0 382 2010 05 23 06 119.464119 15.870264 1.682708e 00 1.213053
1 382 2010 05 23 12 119.910667 15.874892 1.934127e 00 1.221175
2 382 2010 05 23 18 120.368523 16.022879 2.260490e 00 1.227459
3 382 2010 05 24 00 120.611115 15.788021 2.787007e 00 1.229084
4 382 2010 05 24 06 121.286072 15.984570 3.253321e 00 1.230381
5 413 2010 06 10 06 156.424057 5.559299 1.059667e 00 1.578506
6 413 2010 06 10 12 153.899506 6.450210 1.150635e 00 1.516614
7 413 2010 06 10 18 152.346802 7.281753 1.187466e 00 1.501871
Ответ №2:
Не очень красиво, но работает, если ваш файл продолжает работать с той же структурой
import pandas as pd
with open('yourfile.txt') as f:
id = False
d = []
for line in f:
if line.startswith('ID'):
id = line[4:7]
next(f)
elif id and line.strip():
line = line.strip().replace(' amp; ',' ')
d.append(f'{id} {line[:4]} {line[4:6]} {line[6:8]} {line[8:10]} {line[10:]}'.split())
df = pd.DataFrame(d)
df.columns = ['ID','YR','MONTH','DAY','HR','LON','LAT','RESULT1','RESULT2']
print(df)
Out:
ID YR MONTH DAY HR LON LAT RESULT1 RESULT2
0 382 2010 05 23 06 119.464119 15.870264 1.682708e 00 1.213053
1 382 2010 05 23 12 119.910667 15.874892 1.934127e 00 1.221175
2 382 2010 05 23 18 120.368523 16.022879 2.260490e 00 1.227459
3 382 2010 05 24 00 120.611115 15.788021 2.787007e 00 1.229084
4 382 2010 05 24 06 121.286072 15.984570 3.253321e 00 1.230381
5 413 2010 06 10 06 156.424057 5.559299 1.059667e 00 1.578506
6 413 2010 06 10 12 153.899506 6.450210 1.150635e 00 1.516614
7 413 2010 06 10 18 152.346802 7.281753 1.187466e 00 1.501871
Ответ №3:
import csv
output_rows = []
recent_id = ''
recent_starttime = ''
for line in open("input.csv"):
csv_row = line.split() # returns row as list
# Ignores unwanted lines and continue loop
if 'POINT' in csv_row or 'NUMBER' in csv_row:
recent_id = ''
recent_starttime = ''
continue
elif 'ID' in csv_row:
recent_id = csv_row[1]
recent_starttime = csv_row[3]
else str(recent_starttime) in csv_row:
row = {}
row['ID'] = recent_id
row['YR'] = recent_starttime[0:4]
row['MONTH'] = recent_starttime[4:2]
row['DAY'] = recent_starttime[6:2]
row['HR'] = recent_starttime[8:2]
row['LON'] = csv_row[1]
row['LAT'] = csv_row[2]
row['RESULT1'] = csv_row[3]
row['RESULT2'] = csv_row[5]
output_rows.append(row)
else:
continue
if len(output_rows) > 0:
keys = output_rows[0].keys()
with open('output.csv', 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(output_rows)