2014-09-17 5 views
0

У меня есть файлы csv, которые я должен сделать dataframes с panda. обычно файлы в формате, как это:Pandas: Получить данные из файла csv независимо от положения заголовка

Days Page Impressions Visits Bounces 
2012-12-15 692041 87973 31500 
2012-12-16 602356 78663 29298 
2012-12-17 730902 99356 37436 
2012-12-18 730071 97844 37199 
2012-12-19 774964 110446 43858 
2012-12-20 419256 44592 13961 
2012-12-21 320966 33692 10076 
2012-12-22 200992 18840 5170 


Проблема я столкнулся в том, что иногда CSV файлы приходят, как это:

SomeName ABCD   
Account: AccountHolder Name   
Report Author: Analysis   
Description: Some variable length description  

Pivot   

Pivot   
Days Page Impressions Visits Bounces 
2012-12-15 367143 69147 30222 
2012-12-16 334675 63702 28040 
2012-12-17 409260 77171 33642 
2012-12-18 427765 78221 33575 
2012-12-19 434781 79850 34300 
2012-12-20 463448 81361 34501 
2012-12-21 447964 81897 35242 
2012-12-22 368477 70352 31014 
2012-12-23 321891 61973 27521 

Time of Calculation: 2013-03-15 02:14:58    

Как я могу получить только данные, связанные с столбцы дней, Показы страниц, просмотры, Отказы

Я знаю, что я могу сделать list(my_dataframe.columns.values), чтобы получить имена заголовков, но он не работает на типа 2 CSV файла.

Есть ли у них какой-либо существующий Pythonic способ сделать это в пандах или что-то еще?
Thanks

+0

Возможно, проще всего написать отдельный скрипт для очистки данных, пропуская строки без допустимых значений. – monkut

+0

дигностическим способом было бы попытаться прочитать csv, и если есть ошибки, продолжайте увеличивать параметр 'skiprows' до тех пор, пока он не будет работать, к сожалению, это не будет безупречным, и в этом случае вам придется анализировать результат или сначала анализировать заголовки перед определением количества строк, которые нужно пропустить – EdChum

ответ

4

Прочитайте файлы в два прохода. Сначала перечислите строки в файле, чтобы получить строку, в которой находятся заголовки. Передайте этот номер строки в csv parser skiprows arg.

with open('file.csv', 'rb') as infile: 
    for lineno, line in enumerate(infile): 
     if line[:4] = 'Days': 
      break 

df = pd.read_csv('file.csv', skiprows=lineno) 
0

Использование pandas.io.parsers.read_csv. У него есть опция «skiprows». Если ваши файлы всегда имеют одинаковые 6 строк в заголовке, вы можете использовать skiprows = 6

skiprows: list-like или integer Номера строк для пропуска (0-индексированные) или количества строк для пропуска (int) в начало файла т.е.

import pandas as pd 
df = pd.read_cs("path/to/file.csv", sep=";", skiprows=6) 
+0

Это проблема. Количество не соответствующих строк данных не фиксировано. – Stark

+0

В этом случае, возможно, вы можете попробовать сначала прочитать все строки в списке и отбросить строки, которые вам не интересны. Чем вы могли бы сделать pd.DataFrame.from_records() – PlagTag

Смежные вопросы