2012-03-03 4 views
5

Я пытаюсь сделать сводную таблицу с частотами, используя Pandas.Python Pandas Pivot Table

Я следующий код:

from pandas import pivot_table, DataFrame, crosstab 
import numpy as np 
df=DataFrame(
    {'Y':[99999991, 99999992, 99999993, 99999994, 99999995, 
      99999996, 99999997, 99999998, 99999999], 
    'X':[1, 2, 3, 4, 5, 6, 7, 8, 9], 
    'X2':[1, 2, 3, 4, 5, 6, 7, 8, 9]}) 
print pivot_table(df,rows=['Y'], cols=['X'],aggfunc=np.sum) 

Это мой выход:

X   1 2 3 4 5 6 7 8 9 
Y           
    99999991 1 NaN NaN NaN NaN NaN NaN NaN NaN 
    99999992 NaN 2 NaN NaN NaN NaN NaN NaN NaN 
    99999993 NaN NaN 3 NaN NaN NaN NaN NaN NaN 
    99999994 NaN NaN NaN 4 NaN NaN NaN NaN NaN 
    99999995 NaN NaN NaN NaN 5 NaN NaN NaN NaN 
    99999996 NaN NaN NaN NaN NaN 6 NaN NaN NaN 
    99999997 NaN NaN NaN NaN NaN NaN 7 NaN NaN 
    99999998 NaN NaN NaN NaN NaN NaN NaN 8 NaN 
    99999999 NaN NaN NaN NaN NaN NaN NaN NaN 9 

Это мой желаемый результат:

X   1 2 3 4 5 6 7 8 9 
X2           
    1 99999991 NaN NaN NaN NaN NaN NaN NaN NaN 
    2 NaN 99999992 NaN NaN NaN NaN NaN NaN NaN 
    3 NaN NaN 99999993 NaN NaN NaN NaN NaN NaN 
    4 NaN NaN NaN 99999994 NaN NaN NaN NaN NaN 
    5 NaN NaN NaN NaN 99999995 NaN NaN NaN NaN 
    6 NaN NaN NaN NaN NaN 99999996 NaN NaN NaN 
    7 NaN NaN NaN NaN NaN NaN 99999997 NaN NaN 
    8 NaN NaN NaN NaN NaN NaN NaN 99999998 NaN 
    9 NaN NaN NaN NaN NaN NaN NaN NaN 99999999 

Это то, что я получаю:

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 9 entries, 1 to 9 
Data columns: 
('Y', 1L) 1 non-null values 
('Y', 2L) 1 non-null values 
('Y', 3L) 1 non-null values 
('Y', 4L) 1 non-null values 
('Y', 5L) 1 non-null values 
('Y', 6L) 1 non-null values 
('Y', 7L) 1 non-null values 
('Y', 8L) 1 non-null values 
('Y', 9L) 1 non-null values 
dtypes: float64(9) 

Кто-нибудь знает, почему? Является ли вывод слишком большим. Кажется, я ничего не могу найти.

ответ

4

Просто замените rows=['Y'] с rows=['X2']

>>> print pivot_table(df,rows=['X2'], cols=['X'],aggfunc=np.sum) 
     Y           
X  1 2 3 4 5 6 7 8 9 
X2            
1 101 NaN NaN NaN NaN NaN NaN NaN NaN 
2 NaN 102 NaN NaN NaN NaN NaN NaN NaN 
3 NaN NaN 103 NaN NaN NaN NaN NaN NaN 
4 NaN NaN NaN 104 NaN NaN NaN NaN NaN 
5 NaN NaN NaN NaN 105 NaN NaN NaN NaN 
6 NaN NaN NaN NaN NaN 106 NaN NaN NaN 
7 NaN NaN NaN NaN NaN NaN 107 NaN NaN 
8 NaN NaN NaN NaN NaN NaN NaN 108 NaN 
9 NaN NaN NaN NaN NaN NaN NaN NaN 109 
+0

Спасибо! Я отредактировал вопрос, потому что я думаю, что он зависит от числа, и я не могу получить данные в вышеуказанном формате, есть ли у вас какие-либо идеи, почему? – user1026987

+0

Это ожидаемое поведение. Прочитали ли вы эту часть документации: http://pandas.sourceforge.net/reshaping.html? – BioGeek

4

Попробуйте это:

In [3]: df.pivot_table('Y', rows='X', cols='X2') 
X2   1   2   3   4   5   6   7   8   9 
X                       
1 99999991  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
2  NaN 99999992  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
3  NaN  NaN 99999993  NaN  NaN  NaN  NaN  NaN  NaN 
4  NaN  NaN  NaN 99999994  NaN  NaN  NaN  NaN  NaN 
5  NaN  NaN  NaN  NaN 99999995  NaN  NaN  NaN  NaN 
6  NaN  NaN  NaN  NaN  NaN 99999996  NaN  NaN  NaN 
7  NaN  NaN  NaN  NaN  NaN  NaN 99999997  NaN  NaN 
8  NaN  NaN  NaN  NaN  NaN  NaN  NaN 99999998  NaN 
9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN 99999999 

Это будет также работать:

pivot_table(df, 'Y', rows='X', cols='X2') 

или

pivot_table(df, rows='X', cols='X2')['Y'] 
Смежные вопросы