2016-12-27 3 views
-1

私はPythonの初心者ですので、これが簡単なら許してください。ピボット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 

を私は次のようにデータが含まれているCSVファイルを持っています。しかし、私は列としてシンボルを渡すことはできません。

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

これは転置されていません。 Transposingは行と列を入れ替えることを意味するので、 'NxM'行列があれば' MxN'を得ます。あなたの例では、いくつかの列がなくなっています。 – ForceBru

答えて

0

非パンダソリューション

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 
:既存 'EB_CUT.csv'ファイル効果的にあなたが後でよりCSVファイルにマージしたい程度以下のコメントから、次のコードは、それを行うだろうことのように聞こえるの上に、どのよう最後のステップの逆数から進

現在のCSVファイルを読み込み、初期化する代わりに、現在のCSVファイルに対応するdaily_pricesデータを、選択した形式の別のファイルに保存することもできます。 pickleまたはjsonモジュールを使用すると、非常に簡単に書き込んだり、読み込んだりすることができます。

+0

非常に助けてくれてありがとう、素晴らしい作品。私は今、それを追加する必要があるので、最初のステップで複数のcsvを持つように出力ファイルを追加するように、新しい日付またはシンボルに対してはそれを追加する必要があります。私のためのパンダのソリューションは、私は多分それが私のPCに正しくインストールされていない多分パンダのエラーを得たとして動作しませんでした。再度ありがとう – user7346517

+0

ようこそ。データを出力ファイルに追加するには、最初に 'daily_prices'ディクショナリを現在のファイルから初期化します(私の答えに示されているように空の辞書ではなく)。その後、1つ以上のcsvファイルからデータを追加します最後に出力ファイル全体を書き換えます。 – martineau

0

パンダソリューション:

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') 

コンテンツEB_CUT.csvの:あなたはdaily_prices言葉遣いを初期化したい場合は

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) 

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