Перестановка уникальных групп в csv

#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)