Python:具有多个 headers 的 CSV 文件 - 合并到一个数据框中?

Python: CSV file with multiple headers - combine into one data frame?

我想使用 NOAA 网站上的一些数据。这是一个包含自 1851 年以来所有飓风数据的 csv 文件,格式如下:Format example / README file

如您所见,虽然所有内容都包含在一个 csv 文件中,但每个飓风都有自己的 table,还有一个单独的 header。

如何删除 header 并将信息放入 "Hurricane Name" 列?我想将所有内容组合到一个数据框中,这样更容易使用。谢谢!

示例:

AL092011, IRENE, 3,

20110821, 0000, , TS, 15.0N, 59.0W, 45, 1006, 105, 0, 0,
45, 0, 0, 0, 0, 0, 0, 0, 0,

20110821, 0600, , TS, 16.0N, 60.6W, 45, 1006, 130, 0, 0,
80, 0, 0, 0, 0, 0, 0, 0, 0,

20110821, 1200, , TS, 16.8N, 62.2W, 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.9N, 65.0W, 60, 993, 130, 30, 30,
90, 30, 0, 0, 30, 0, 0, 0, 0,

我想将 header 信息放入列中,像这样:

AL092011, IRENE, 20110821, 0000, , TS, 15.0N, 59.0W, 45, 1006, 105, 0, 0,
45, 0, 0, 0, 0, 0, 0, 0, 0,

AL092011, IRENE, 20110821, 0600, , TS, 16.0N, 60.6W, 45, 1006, 130, 0, 0,
80, 0, 0, 0, 0, 0, 0, 0, 0,

AL092011, IRENE, 20110821, 1200, , TS, 16.8N, 62.2W, 45, 1005, 130, 0, 0,
70, 0, 0, 0, 0, 0, 0, 0, 0,

AL092012, ANOTHER_NAME, 20110821, 1800, , TS, 17.5N, 63.7W, 50, 999, 130, 20, 0,
70, 30, 0, 0, 0, 0, 0, 0, 0,

AL092012, ANOTHER_NAME, 20110822, 0000, , TS, 17.9N, 65.0W, 60, 993, 130, 30, 30,
90, 30, 0, 0, 30, 0, 0, 0, 0,

嗯,这就是我想出的。可能不是最快的方法(有兴趣知道是什么,请!)但它完成了工作。我将 csv 拆分为每个飓风的不同文件。然后,我再次将这些文件一个一个地加载,将 header 重新格式化为附加列,并将所有文件连接成一个 data-frame。如果我能以更有效的方式做到这一点,请告诉我:)

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