2015-07-13 2 views
1

Я новичок в pandas и python и пытаюсь переделать данные, предоставленные в CSV. Данные структурированы таким образом, что тикеры с соответствующими закрытиями и датами являются последовательными в одном столбце.Группировка данных по уникальным клавишам столбцов и объединению (сводная таблица) в Pandas Python

Например:

   TIC  CLOSE 
DATE       
1984-01-03 0223B 25.37500 
1984-01-04 0223B 25.75000 
1984-01-05 0223B 25.75000 
1983-12-30 0485B 21.37500 
1984-01-03 0485B 21.37500 
1984-01-04 0485B 22.50000 
1983-12-30 0491B 17.75000 
1984-01-03 0491B 17.50000 
1984-01-04 0491B 17.62500 
1983-12-30 3614B 74.25000 
1984-01-03 3614B 73.25000 
1984-01-04 3614B 76.00000 
1993-07-01 3615B 47.25000 
1993-07-02 3615B 47.25000 
1993-07-06 3615B 46.40625 
1983-12-30 3ABNKQ 4.75000 
1984-01-03 3ABNKQ 5.00000 
1984-01-04 3ABNKQ 5.62500 
1983-12-30 3ACKH 55.25000 
1984-01-03 3ACKH 54.50000 
1984-01-04 3ACKH 55.25000 

Я хочу, чтобы изменить данные, так что я буду иметь панда dataframe где каждый столбец будет бегущей строкой с его соответствующими закрытиями и если нет никаких данных для даты строки ключ будет иметь NaN ('left' join).

Я пытался что-то вроде этого:

sp = pd.read_csv('D:\Stocks.csv') 
sp = pd.DataFrame(sp) 
sp.columns = ['TIC', 'DATE', 'CLOSE'] 
sp.index = pd.to_datetime(sp['DATE']) 
sp = sp[['TIC', 'CLOSE']] 
unique_tickers = sp['TIC'].unique() 

s0 = sp[sp['TIC'] == unique_tickers[0]] 
s0 = pd.DataFrame(s0['CLOSE']) 
s1 = sp[sp['TIC'] == unique_tickers[1]] 
s1 = pd.DataFrame(s1['CLOSE']) 

s0s1 = pd.concat([s0, s1], axis = 1) 
s0s1.columns = unique_tickers[0:2] 

for i in range(len(unique_tickers)): 
    sx = sp[sp['TIC'] == unique_tickers[i]] 
    sx = pd.DataFrame(sx['CLOSE']) 
    s0s1 = pd.concat([s0s1, sx], axis = 1) 

Я предполагаю, что я мог бы взломать код выше, чтобы заставить его работать, но я предполагаю, что есть гораздо более элегантное решение. Есть идеи?

Спасибо!

Я получил решение первоначальных проблем, который был (благодаря BrenBarn):

sp = sp.reset_index().pivot(index='DATE', columns="TIC", values="CLOSE") 

Но когда я запустил его в большем формате CSV я побежал в следующую ошибку,

ValueError: Index contains duplicate entries, cannot reshape

Я попытался найти решение, попробовав sp.groupby ('TIC'), затем возьмем все уникальные ключи строки «Дата», но он может понять синтаксис .. снова любая помощь будет оценена!

ответ

1

Это то, что вы хотите?

>>> d.reset_index().pivot(index='DATE', columns="TIC", values="CLOSE") 
TIC   0223B 0485B 0491B 3614B  3615B 3ABNKQ 3ACKH 
DATE                
1983-12-30  NaN 21.375 17.750 74.25  NaN 4.750 55.25 
1984-01-03 25.375 21.375 17.500 73.25  NaN 5.000 54.50 
1984-01-04 25.750 22.500 17.625 76.00  NaN 5.625 55.25 
1984-01-05 25.750  NaN  NaN NaN  NaN  NaN NaN 
1993-07-01  NaN  NaN  NaN NaN 47.25000  NaN NaN 
1993-07-02  NaN  NaN  NaN NaN 47.25000  NaN NaN 
1993-07-06  NaN  NaN  NaN NaN 46.40625  NaN NaN 

мне пришлось использовать reset_index, потому что pivot требует столбец в качестве индекса (по крайней мере до this bug фиксировано).

+0

Отлично, это именно то, что я .. Я думал, что это должно быть стержнем, но не может работать. – user1129988