2016-02-28 87 views
2

我有一個csv文件,我想用Python中的Pandas庫讀取它。讀取Pandas和/或Tableau中的CSV文件並使用不同行大小

在本表中,當我們遇到一個新項目時(例如下面例子中的項目編號爲1393或1654),我們首先有一個4列的行元數據,之後有幾百列行作爲與該項目相關的實際數據。然後再次發生下一個項目等等。

表是這樣的:

1,1393,0,0 
1,1393,1,22,55,63,... 
1,1393,5,32,43,163,... 
. 
. 
. 
2,1654,0,0 
2,1654,8,95,96,142,... 
2,1654,21,31,364,9,... 
. 
. 
. 

所以問題是:

  1. 某些行有不同的大小比其他
  2. 我們沒有頭,不能創建它的第一行有4個條目,第二個有100個條目
  3. 我的CSV文件很大(大約10G)!

任何有助於我在Pandas或任何其他Python庫中組織數據的建議值得高度讚賞。

PS:順便說一句,任何人都知道如何在Tableau中管理它?

+0

要得到這個直...你有2行大小 - 4列元數據和其他所有其他都是固定大小> 100?你想用元數據做什麼?將它添加到列中或放下它? – tdelaney

+0

您可以創建csv.reader的子類並覆蓋下一個方法,以便所有行具有相同數量的列。 –

+0

@tdelaney是的,我想放棄它們。 – DanielWelke

回答

1

當數據不符合現有的pandas閱讀器時,您可以創建自己的生成器並使用from_records填充數據框。由於缺乏關於這些不同項目應該如何關聯的細節,我寫了一個例子,將最新的元數據添加到每行的前面。

import pandas as pd 

def my_data_generator(fp): 
    metadata = [] 
    for line in fp: 
     data = line.strip().split(',') 
     if len(data) == 4: 
      metadata = data 
     elif not metadata: 
      raise ValueError("csv file did not start with metadata") 
     elif data: 
      yield metadata + data 

df = pd.DataFrame.from_records(my_data_generator(open('somefile.csv'))) 
print(df) 
1

查看源代碼後,我發現csv.reader不是一個類,而是一個方法。然而,我測試此解決方案:

import csv 

class same_width_reader(object): 
    def __init__(self, iterable, width=0, dialect='excel', *args, **kwargs): 
     self._reader = csv.reader(iterable, dialect, *args, **kwargs) 
     self.width = width 

    def __iter__(self): 
     return self 

    def next(self): 
     result = self._reader.next() 
     if self.width: 
      width = len(result) 
      if width < self.width: 
       result += ['0'] * (self.width - width) 
     return result 

if __name__ == '__main__': 
    with open('input.csv') as csv_file: 
     reader = same_width_reader(csv_file, 6) 
     for line in reader: 
      print line 

對於此輸入

1,1393,0,0 
1,1393,1,22,55,63 
1,1393,5,32,43,163 

該程序產生該輸出

['1', '1393', '0', '0', '0', '0'] 
['1', '1393', '1', '22', '55', '63'] 
['1', '1393', '5', '32', '43', '163'] 

它應該能夠適應這種解決方案與任何其他庫的工作讀取CSV文件。