Python: CSV-файл с несколькими заголовками - объединить в один фрейм данных? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу использовать некоторые данные с сайта NOAA.Это файл csv, содержащий данные для всех ураганов с 1851 года, в таком формате: Пример формата / файл README

Как видите, все содержится в одном файле csv,У каждого урагана есть своя таблица с отдельным заголовком.

Как я могу удалить заголовки и поместить информацию в столбец "Имя урагана"?Я хочу объединить все в один фрейм данных, чтобы его было проще использовать.Спасибо!

Пример:

AL092011, IRENE, 3,

20110821, 0000, TS, 15,0 N, 59,0 Вт, 45, 1006, 105,0, 0,
45, 0, 0, 0, 0, 0, 0, 0, 0,

20110821, 0600, TS, 16,0N, 60,6 Вт, 45, 1006, 130,0, 0,
80, 0, 0, 0, 0, 0, 0, 0, 0,

20110821, 1200, TS, 16,8N, 62,2 Вт, 45, 1005, 130,0, 0,
70, 0, 0, 0, 0, 0, 0, 0, 0,

AL092012, ANOTHER_NAME, 2,

20110821, 1800,, TS,17,5N, 63,7W, 50, 999, 130, 20, 0,
70, 30, 0, 0, 0, 0, 0, 0, 0,

20110822, 0000,, TS,17,9 N, 65,0 Вт, 60, 993, 130, 30, 30,
90, 30, 0, 0, 30, 0, 0, 0, 0,

Я хотел быинформация заголовка в столбцы, например:

AL092011, IRENE, 20110821, 0000, TS, 15,0N, 59,0 Вт, 45, 1006, 105, 0, 0,
45, 0, 0, 0, 0, 0, 0, 0, 0,

AL092011, IRENE, 20110821, 0600, TS, 16,0N, 60,6 Вт, 45, 1006, 130, 0, 0,
80, 0, 0, 0, 0, 0, 0, 0, 0,

AL092011, IRENE, 20110821, 1200, TS, 16,8N, 62,2 Вт, 45, 1005, 130, 0, 0,
70, 0, 0, 0, 0, 0, 0, 0, 0,

AL092012,ANOTHER_NAME, 20110821, 1800, TS, 17,5N, 63,7 Вт, 50, 999, 130, 20, 0,
70, 30, 0, 0, 0, 0, 0, 0, 0,

AL092012, ANOTHER_NAME, 20110822, 0000, TS, 17,9 N, 65,0 Вт, 60, 993, 130, 30, 30,
90, 30, 0, 0, 30, 0, 0, 0, 0,

1 Ответ

0 голосов
/ 01 июня 2018

Ну, это то, что я придумал.Возможно, это не самый быстрый метод (интересно узнать, что это, пожалуйста!), Но он делает свою работу.Я разделил CSV в отдельный файл для каждого урагана.Затем я снова загрузил эти файлы один за другим, переформатировав заголовок как дополнительные столбцы и объединив все файлы в один фрейм данных.Пожалуйста, дайте мне знать, если бы я мог сделать это более эффективным способом:)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import glob

# split hurricanes into separate files
partNum = 1
outHandle = None
for line in open("data/atlantic_1851_2017_2.csv","r").readlines():
    if line.startswith('AL'):
        if outHandle is not None:
            outHandle.close()
        outHandle = open("data/part%d.csv" % (partNum,), "w")
        partNum += 1
    outHandle.write(line)
outHandle.close()


# read in each file as data-frame
files = glob.glob('data/part*.csv')
frames = []
for csv in files:  
    with open(csv) as f:
        first_line = f.readline() 
    first_line = first_line.split(',')    
    df = pd.read_csv(csv, skiprows=[0], header=None)
    df['ID'] = first_line[0]
    df['Name'] = first_line[1]
    frames.append(df)


# concatenate into a single data-frame
df = pd.concat(frames)
df = df.drop(columns=[8,9,10,11,12,13,14,15,16,17,18,19,20])
df.columns = ['Date','Time','Record_ID','Strength','Lat','Long','Max_Wind_Knots','Max_Pressure_mb','ID','Name']
print(df.head(5))
...