2013-05-31 9 views
5

Esiste un'opzione per non far cadere gli indici con 'nan' in essi? Penso che far cadere silenziosamente queste righe dal perno a un certo punto causerà a qualcuno un serio dolore.python pandas: pivot_table abbassa silenziosamente gli indici con nans

import pandas 
import numpy 

a = [['a', 'b', 12, 12, 12], ['a', numpy.nan, 12.3, 233., 12], ['b', 'a', 123.23, 123, 1], ['a', 'b', 1, 1, 1.]] 

df = pandas.DataFrame(a, columns=['a', 'b', 'c', 'd', 'e']) 

df_pivot = df.pivot_table(rows=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum) 
print(df) 
print(df_pivot) 

uscita:

a b  c d e 
0 a b 12.00 12 12 
1 a NaN 12.30 233 12 
2 b a 123.23 123 1 
3 a b 1.00 1 1 
      c d e 
a b     
a b 13.00 13 13 
b a 123.23 123 1 

risposta

6

Questo non è attualmente supportato, vedono questo problema per la valorizzazione: https://github.com/pydata/pandas/issues/3729.

Soluzione per riempire l'indice con un manichino, perno, e sostituire

In [28]: df = df.reset_index() 

In [29]: df['b'] = df['b'].fillna('dummy') 

In [30]: df['dummy'] = np.nan 

In [31]: df 
Out[31]: 
    a  b  c d e dummy 
0 a  b 12.00 12 12 NaN 
1 a dummy 12.30 233 12 NaN 
2 b  a 123.23 123 1 NaN 
3 a  b 1.00 1 1 NaN 

In [32]: df.pivot_table(rows=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum) 
Out[32]: 
       c d e 
a b      
a b  13.00 13 13 
    dummy 12.30 233 12 
b a  123.23 123 1 

In [33]: df.pivot_table(rows=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum).reset_index().replace('dummy',np.nan).set_index(['a','b']) 
Out[33]: 
      c d e 
a b     
a b  13.00 13 13 
    NaN 12.30 233 12 
b a 123.23 123 1 
+0

Forse qualcuno potrebbe iniettare un messaggio di avviso quando ci sono valori nan nell'indice? Non vedo che debba essere "supportato" davvero. Riempire manualmente va bene, devi solo sapere che deve essere fatto. – mathtick

+0

Il problema è che questa è una 'caratteristica', in quanto quando si raggruppa e si ha un NaN viene escluso; Suppongo che tu possa avere un'opzione che controlli questo (e di default è falso); e/o solleva – Jeff

+0

Sono d'accordo ma non riesco a immaginare che un avvertimento possa infrangere la nozione della caratteristica di qualcuno. Potresti anche avere un flag in pivot_table per non stampare l'avviso. Sono solo preoccupato per la sicurezza. – mathtick

Problemi correlati