【问题标题】:Python: CSV file with multiple headers - combine into one data frame?Python:具有多个标题的 CSV 文件 - 合并为一个数据框?
【发布时间】:2018-06-01 14:07:37
【问题描述】:

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

如您所见,尽管所有内容都包含在一个 csv 文件中,但每个飓风都有自己的表格,并带有单独的标题。

如何删除标题并将信息放在“飓风名称”列中?我想将所有内容组合到一个数据框中,因此更易于使用。谢谢!

例子:

AL092011,艾琳,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,

我想把标题信息放到列中,像这样:

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,

【问题讨论】:

  • 每个标头都以“AL”开头,因此应该很容易确定在哪里拆分数据
  • 您不能创建一个输入示例来帮助我们理解您的数据并包含所需的输出吗?
  • @zipa 链接中有数据示例
  • 链接中的数据示例包含单个表格,您没有向我们提供所需的输出。请看如何提供minimal reproducible example
  • @zipa 它只是 csv 文件的一部分,基本上数据与此相同,但使用不同的标题一遍又一遍地重复..

标签: python pandas csv dataframe data-cleaning


【解决方案1】:

这就是我想出的。可能不是最快的方法(有兴趣知道是什么,拜托!)但它可以完成工作。我将 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2022-01-20
    • 2020-03-13
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多