2017-05-10 6 views
1

ich derzeit einen Pandas Multi Index dieser Struktur (mit Ticker und Feld, um die Indizes zu sein):Pandas Multi Index

           value 
ticker   field      
DE0001141174 Govt CASH_FLOW_DATE 2000-11-21 
        CASH_FLOW_AMOUNT  51250 
        PRINCIPAL_AMOUNT  1e+06 
DE0001141232 Govt CASH_FLOW_DATE 2000-05-17 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT   0 
        CASH_FLOW_DATE 2001-05-17 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT   0 
        CASH_FLOW_DATE 2002-05-17 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT  1e+06 
DE0001141380 Govt CASH_FLOW_DATE 2002-08-18 
        CASH_FLOW_AMOUNT  67808.2 
        PRINCIPAL_AMOUNT   0 
        CASH_FLOW_DATE 2003-08-18 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT   0 
        CASH_FLOW_DATE 2004-08-18 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT   0 
        CASH_FLOW_DATE 2005-08-18 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT   0 
        CASH_FLOW_DATE 2006-08-18 
        CASH_FLOW_AMOUNT  45000 
        PRINCIPAL_AMOUNT  1e+06 

und ich möchte es in eine Struktur wie diese mit dem Ticker und CASH_FLOW_DATE umgewandelt werden wobei die Indizes:

ticker    CASH_FLOW_DATE CASH_FLOW_AMOUNT PRINCIPAL_AMOUNT   
DE0001141174 Govt 2000-11-21  51250    1e+06 
DE0001141232 Govt 2000-05-17  45000    0 
        2001-05-17  45000    0 
        2002-05-17  45000    1e+06 
DE0001141380 Govt 2002-08-18  67808.2    0 
        2003-08-18  45000    0 
        2004-08-18  45000    0 
        2005-08-18  45000    0 
        2006-08-18  45000    0 

ich denke, das Problem ist, dass python/Pandas keine Möglichkeit zu erkennen, natürlich hat, dass die beiden Reihen unter ‚CASH_FLOW_DATE‘ auf diesen Wert bezogen sind. Ich denke, ich könnte es mit vielen hässlichen Loops machen, aber ich frage mich, ob es eine pythischere Art gibt, das zu tun.

Antwort

1

Sie benötigen cumcount für neue Ebene des Index, der von set_index zur ursprünglichen Index angehängt wird und dann unstack nennen:

df = df.set_index(df.groupby(level=[0,1]).cumcount(), append=True) 
df = df['value'].unstack(level=1, fill_value=0).reset_index(level=1, drop=True).reset_index() 
print (df) 
field    ticker CASH_FLOW_AMOUNT CASH_FLOW_DATE PRINCIPAL_AMOUNT 
0  DE0001141174 Govt   51250  2000-11-21   1e+06 
1  DE0001141232 Govt   45000  2000-05-17    0 
2  DE0001141232 Govt   45000  2001-05-17    0 
3  DE0001141232 Govt   45000  2002-05-17   1e+06 
4  DE0001141380 Govt   67808.2  2002-08-18    0 
5  DE0001141380 Govt   45000  2003-08-18    0 
6  DE0001141380 Govt   45000  2004-08-18    0 
7  DE0001141380 Govt   45000  2005-08-18    0 
8  DE0001141380 Govt   45000  2006-08-18   1e+06 
+0

Große, vielen Dank, dass der Job doest (nach wieder zu Multi-Index-Einstellung mit df.set_index (['ticker', 'field'], inplace = True)) – Tobias

+0

Ich meinte df.set_index (['ticker', 'CASH_FLOW_DATE'], inplace = True) – Tobias

Verwandte Themen