2017-01-29 15 views
3

Моя терминология ужасна, поэтому этот заслуживает некоторого объяснения. Представьте себе, что у меня есть DataFrame как это (который я называю «длинную» таблицу):В Pandas, как я могу преобразовать «длинный» стол в «широкую и разреженную» таблицу?

time  stock  price 
--------------------------- 
13:03:00 AAPL  100.00 
13:03:00 SPY  200.00 
13:03:01 AAPL  100.01 
13:03:02 SPY  200.01 
13:03:03 SPY  200.02 
. 
. 
. 

, и я хотел, чтобы преобразовать его в DataFrame, как это (который я называю «широкой и разреженной» таблица):

time  AAPL  SPY 
--------------------------- 
13:03:00 100.00 200.00 
13:03:01 100.01 Nan 
13:03:02 Nan  200.01 
13:03:03 Nan  200.02 

Таким образом, очевидно, что это довольно трансформация. Есть ли встроенная функция, которая делает это? Похоже, что это может быть довольно распространенная вещь.

Спасибо!

ответ

2

Вы можете использовать pivot:

df = df.pivot(index='time', columns='stock', values='price') 
print (df) 
stock  AAPL  SPY 
time      
13:03:00 100.00 200.00 
13:03:01 100.01  NaN 
13:03:02  NaN 200.01 
13:03:03  NaN 200.02 

Другое решение с unstack:

df = df.set_index(['time', 'stock']).price.unstack() 
print (df) 
stock  AAPL  SPY 
time      
13:03:00 100.00 200.00 
13:03:01 100.01  NaN 
13:03:02  NaN 200.01 
13:03:03  NaN 200.02 

Но если получить:

ValueError: Index contains duplicate entries, cannot reshape

Является necessery использование pivot_table с некоторыми агрегатной функции, по умолчанию np.mean ,

print (df) 
     time stock price 
0 13:03:00 AAPL 100.00 
1 13:03:00 SPY 200.00 
2 13:03:01 AAPL 100.01 
3 13:03:02 SPY 200.01 
4 13:03:03 SPY 200.02 
5 13:03:03 SPY 500.02 <- duplicates for same time and stock 


df = df.pivot_table(index='time', columns='stock', values='price') 
print (df) 
stock  AAPL  SPY 
time      
13:03:00 100.00 200.00 
13:03:01 100.01  NaN 
13:03:02  NaN 200.01 
13:03:03  NaN 350.02 

Другим возможным решением для дублей time и stock:

df = df.groupby(['time', 'stock']).price.mean().unstack() 
print (df) 
stock  AAPL  SPY 
time      
13:03:00 100.00 200.00 
13:03:01 100.01  NaN 
13:03:02  NaN 200.01 
13:03:03  NaN 350.02