2016-12-27 5 views
-1

Я новичок в Python, поэтому, пожалуйста, простите, если это легко. У меня есть CSV-файл, который содержит следующие данные:Pivot данные 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

Pandas отлично подходит для такого рода вещей. –

+1

Это не транспонирование. Транспонирование означает обмен строк и столбцов, так что если у вас есть матрица NxM, вы получаете 'MxN'. В вашем примере некоторые столбцы исчезли. – ForceBru

ответ

0

Non-панды решение:

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 для его инициализации было бы также всегда сохранять данные daily_prices, соответствующие текущему файлу CSV в отдельном файле, в любом формате, который вы выберете. Его можно было легко записать и прочитать, используя модули pickle или json.

+0

Большое спасибо за помощь, отлично работает. Теперь мне просто нужно добавить его так, чтобы для любых новых дат или символов он добавлял выходной файл, так как у меня будет несколько csv на первом шаге, но я вижу, могу ли я это обработать. Решение Pandas для меня не работало, так как у меня появилось много ошибок Pandas, возможно, он не установлен правильно на моем ПК. Еще раз спасибо – user7346517

+0

Добро пожаловать. Чтобы добавить данные в выходной файл, сначала инициализируйте словарь 'daily_prices' из того, что в настоящее время находится в файле (вместо того, чтобы начинать его как пустой словарь, как показано в моем ответе), затем добавляйте данные к этому из одного или нескольких файлов 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 Содержание:

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