2017-01-29 4 views
3

Meine Terminologie ist schrecklich, deshalb verdient diese eine Erklärung. Stellen Sie sich vor, dass ich einen Datenrahmen wie diese haben (was ich die „lange“ Tabelle nennen):Wie kann ich in Pandas eine "lange" Tabelle in eine "breite und spärliche" Tabelle konvertieren?

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 
. 
. 
. 

und ich wollte es zu einem Datenrahmen so konvertieren (die ich die „breit und spärlich“ Tabelle nennen):

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 

Also offensichtlich ist dies eine ziemlich Transformation. Gibt es dafür eine eingebaute Funktion? Es scheint, als ob es eine ziemlich gewöhnliche Sache wäre, etwas tun zu wollen.

Dank!

Antwort

2

können Sie pivot verwenden:

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 

Eine andere Lösung mit 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 

Aber wenn bekommen:

ValueError: Index contains duplicate entries, cannot reshape

Ist necessery Verwendung pivot_table mit einigen Aggregatfunktion, default 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 

Eine andere mögliche Lösung für Duplikate time und 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 
Verwandte Themen