2016-12-27 80 views
-1

我是新來的Python,所以請原諒,如果這很容易。我有一個包含數據如下csv文件:數據透視csv數據?

Symbol,date,price 
apple, 23/12/2016, 50 
apple, 26/12/2016, 51 
apple, 27/12/2016, 52 
google,23/12/2016, 70 
google,26/12/2016, 71 
google,27/12/2016, 72 

我需要寫一個新的CSV文件(如下所示):

Date, apple, google 
23/12/2016,50,70 
26/12/2016,51,71 
27/12/2016,52,72 

我到目前爲止的代碼如下所示。但是,我似乎無法像列一樣獲得符號。

import csv 
import os 

csv.register_dialect(
    'mydialect', 
    delimiter =',', 
    ) 

symbol, date=[],[] 

with open('EB_CUT2.csv',"rt") as dfile: 
    thedata = csv.reader(dfile, dialect ='mydialect') 
    for row in thedata: 
     if row[4] not in date: 
      date.append(row[4]) 
     if row[0] not in symbol: 
      symbol.append(row[0]) 
dfile.close() 

ebout = open('EB_CUT.csv',"wt",newline='') 
wr = csv.writer(ebout) 
for val in date: 
    wr.writerow([val]) 
ebout.close() 
+0

請格式化您的csv文件,以便我們能夠更好地幫助您 – NinjaGaiden

+0

熊貓非常適合這類事情。 –

+1

這不是移調。移調意味着交換行和列,所以如果你有一個'NxM'矩陣,你可以得到'MxN'。在你的例子中,一些列不見了。 – ForceBru

回答

0

非大熊貓的解決方案:

import csv 
from datetime import datetime 
import os 

MY_DIALECT = 'mydialect' 
csv.register_dialect(MY_DIALECT, delimiter =',', skipinitialspace=True,) 

daily_prices = {} 
with open('EB_CUT2.csv', "rt", newline='') as dfile: 
    reader = csv.DictReader(dfile, dialect=MY_DIALECT) 
    for row in reader: 
     date = datetime.date(datetime.strptime(row['date'], '%d/%m/%Y')) 
     entry = daily_prices.setdefault(date, {}) 
     entry[row['Symbol']] = row['price'] 

all_symbols = sorted(
    set(symbol for value in daily_prices.values() for symbol in value)) 

with open('EB_CUT.csv', "wt", newline='') as ebout: 
    writer = csv.writer(ebout) 
    writer.writerow(['Date'] + all_symbols) # header 
    for date, prices in sorted(daily_prices.items()): 
     row = [date.strftime('%d/%m/%Y')] 
     for symbol in all_symbols: 
      row.append(prices.get(symbol, '')) 
     writer.writerow(row) 

如果你想初始化daily_prices文辭任何現有'EB_CUT.csv'文件有效的最後一步的逆元上面顯示,它聽起來就像你從你的評論可能低於希望在更多的CSV文件後進行合併,下面的代碼將做到這一點:

daily_prices = {} 
if os.path.isfile('EB_CUT.csv'): # existing file? 
    # Initialize daily_prices from existing csv file. 
    with open('EB_CUT.csv', "rt", newline='') as inf: 
     reader = csv.reader(inf) 
     next(reader) # skip header row 
     for row in reader: 
      date = datetime.date(datetime.strptime(row[0], '%d/%m/%Y')) 
      days_prices = daily_prices.setdefault(date, {}) 
      for symbol, price in row[1:]: 
       days_prices[symbol] = price 

讀取當前csv文件進行初始化的另一種方法是始終將與當前csv文件對應的daily_prices數據保存在單獨的文件中,而不管您選擇何種格式。通過使用picklejson模塊,可以非常輕鬆地書寫和讀回。

+0

非常感謝您的幫助,效果很好。我現在只需要添加它,以便任何新的日期或符號附加輸出文件,因爲我會在第一步中有多個csv,但我看看我能否解決這個問題。熊貓解決方案對我來說沒有工作,因爲我得到了很多熊貓的錯誤​​,也許它沒有正確安裝在我的電腦上。再次感謝 – user7346517

+0

不客氣。要將數據附加到輸出文件,首先要根據文件中當前內容(而不是從我的答案中顯示的空字典開始)初始化'daily_prices'字典,然後將數據添加到來自一個或多個csv文件的數據中,最後重寫整個輸出文件。 – martineau

0

一個熊貓的解決方案:

內容的 EB_CUT.csv
import pandas 

df = pd.read_csv('EB_CUT2.csv', index_col=1, parse_dates=True) 
df2 = pd.pivot_table(df, values='price', columns=['Symbol'], index=df.index) 
df2.to_csv('EB_CUT.csv') 

date,apple,google 
2016-12-23,50,70 
2016-12-26,51,71 
2016-12-27,52,72