簡體   English   中英

熊貓中的read_csv-如何使用特定行作為標題

[英]read_csv in pandas - how to use a specific row as header

嘗試解析此文件:

https://gist.github.com/anonymous/7714935

看起來像:

metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line 
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line
metadata line

col1   col2         col3    UTCDate   UTCTime       col6       col7   
                           (m)      (MDY)     (sec)    (weeks)      (MDY)     
string1- string2-        0.000 11/06/2013 313585.10 1765.00000 11/06/2013 
string1- string2-        0.000 11/06/2013 313585.30 1765.00000 11/06/2013 
...

我可以使用類似的代碼閱讀它:

import pandas as pd
import datetime as dt
names=['col1','col2','col3','UTCDate','UTCTime','col6','col7']

def parse(UTCDate,UTCTime):
    return dt.datetime.strptime(UTCDate, '%m/%d/%Y') + dt.timedelta(seconds=float(UTCTime))

df = pd.read_csv(filename, delimiter=r'\s+', skiprows=25, index_col='date', parse_dates={'date':['UTCDate','UTCTime']}, names=names, date_parser=parse)

有沒有一種方法可以避免在列表中指定“名稱”,而是嘗試解析標頭?

標頭是這一行:

col1   col2         col3    UTCDate   UTCTime       col6       col7

要點中的第24行。 我當時想讓keep_date_col = True,標題= 0,並像[arange(0,23),25] ..這樣傳遞行列表以進行跳過,但是沒有用。

我認為您的一般做法是可以的。 至少對我來說,我認為失敗的地方是定界符和“ Longitude / Latitude列。 您的定界符為“ \\ s +”,但是這些列中的數據看起來像三列而不是一列。

Latitude        Longitude
41 20 54.57907  -70 38 14.25924

也許您可以用制表符替換所有雙精度空格並將制表符用作定界符。 或者,如果只需要前七列,則只需將其余部分刪除,然后再將其提供給數據框即可。

您是否嘗試過read_csv()header=# arg?

pd.read_csv(filename, delimiter=r'\\s+', skiprows=25, index_col='date', parse_dates={'date':['UTCDate','UTCTime']}, header=26, date_parser=parse)

文件狀態:

header:int,int列表用作列名的行號以及數據的開頭。 如果未傳遞names ,則默認為0,否則為None 顯式傳遞header=0以便能夠替換現有名稱。 標頭可以是整數列表,這些整數指定列Eg [0,1,3]上的多索引的行位置。 未指定的中間行將被跳過(例如,在此示例中為2)。 請注意,如果skip_blank_lines=True ,則此參數將忽略注釋行和空行,因此header = 0表示數據的第一行,而不是文件的第一行。

我不會說它過於優雅,但是您可以在csv的幫助下,將此問題推廣為處理可變數量的要跳過的行

import csv
import pandas as pd

counter=0
testfile=open(filename, 'r')
filereader = csv.reader(testfile, delimiter=r'\s+')
for row in filereader :
    counter += 1 #Keep track of row number
    if 'col1' in row: #Or whatever string you're looking for as the first row
        finalcount=counter

Output=pd.read_csv(filename,sep=r'\s+',skiprows=finalcount-1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM