2013-05-31 14 views
5

Czy istnieje opcja nie upuszczenia indeksów z "nan" w nich? Myślę, że po cichu upuszczenie tych rzędów z czopa spowoduje u kogoś poważny ból.python pandas: pivot_table po cichu opuszcza indeksy z 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) 

wyjściowa:

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 

Odpowiedz

6

To nie jest obecnie obsługiwana, zobacz tę kwestię w celu poprawy: https://github.com/pydata/pandas/issues/3729.

Obejście wypełnić indeks z manekina, pivot, i zastąpić

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

Może ktoś mógłby wstrzyknąć komunikat ostrzegawczy, gdy istnieją wartości nan w indeksie? Nie widzę, żeby naprawdę trzeba było "wspierać". Ręczne wypełnianie jest w porządku, po prostu musisz wiedzieć, że to musi być zrobione. – mathtick

+0

Problem polega na tym, że jest to "cecha", ponieważ w przypadku grupowania i posiadania NaN jest ona wykluczona; Przypuszczam, że możesz mieć opcję, która kontroluje to (i domyślnie jest fałszywa); i/lub podnosi – Jeff

+0

Zgadzam się, ale nie mogę sobie wyobrazić, że ostrzeżenie złamałoby kogokolwiek pojęcie funkcji. Możesz nawet mieć flagę w pivot_table, aby nie drukować ostrzeżenia. Martwię się tylko o bezpieczeństwo. – mathtick

Powiązane problemy