2015-08-11 4 views
3

У меня есть pandas Series, достаточно маленький, поэтому я могу читать все предметы (около 80), но слишком большие для размера экрана.Как отсортировать список в python?

Есть некоторые python команды Ou ipython (ноутбук) волшебная команды или pandas функции columnate, что list или Series, так что я могу читать его полностью без прокрутки вниз и вверх?

Я в основном ищу эквивалент команды column в bash.

К примеру, у меня есть Series вроде этого:

A  76 
B  56 
C  42 
D  31 
E  31 
F  25 
G  24 

И давайте говорить, что мой экран настолько мала, что мне нужно, чтобы прокрутить вниз, чтобы увидеть после B строки. То, что я хотел бы что-то вроде этого:

A 76  C 42  E 31  G 24 
B 56  D 31  F 25 
+0

взгляните на этот вопрос и принятый ответ: https://stackoverflow.com/questions/11707586/python-pandas-widen-output-display Это то, что вы хотите сделать? –

+0

Нет, это то, что я делаю сейчас, чтобы отображать больше, чем X строк. Дело в том, что у меня есть 1 столбец, и мне бы хотелось, чтобы он отображался с несколькими столбцами, поэтому все данные могут поместиться на экране. – jrjc

+0

Что такое «экран»? Это терминал? Это HTML? Число столбцов в терминале всегда будет согласованным? – IanAuld

ответ

3

Следующая без NumPy/панды решение может дать вам некоторое вдохновение:

import itertools 

rows = [("A", 76), ("B", 56), ("C", 42), ("D", 31), ("E", 31), ("F", 25), ("G", 24)] 

def print_multi_cols(lrows, split_at=5, space_each=4): 
    for row in itertools.izip(*itertools.izip_longest(*[iter(lrows)]*split_at, fillvalue=(" ", " "))): 
     for col in row: 
      print " ".join(["%-*s" % (space_each, item) for item in col]), 
     print 

print_multi_cols(rows, 2) 
print_multi_cols(rows, 3) 

Это дает следующий результат:

A  76  C  42  E  31  G  24  
B  56  D  31  F  25     

A  76  D  31  G  24  
B  56  E  31     
C  42  F  25 

Вам нужно будет преобразовать свою серию прежде, чем это можно было бы использовать. Протестировано с использованием Python 2.7.

Или немного больше контроля над обоснованием, он может быть изменен следующим образом:

import itertools 

rows = [("A", 9), ("B", 56), ("C", 42), ("D", 31), ("E", 31), ("F", 25), ("G", 999)] 

def print_multi_cols(lrows, split_at=5, space_each=4, left_justify=None): 
    if not left_justify: 
     left_justify = [True] * len(lrows[0]) 

    for row in itertools.izip(*itertools.izip_longest(*[iter(lrows)]*split_at, fillvalue=(" ", " "))): 
     for col in row: 
      print " ".join([("%-*s " if left else "%*s ") % (space_each, item) for item, left in itertools.izip(col, left_justify)]), 
     print 
    print 

print_multi_cols(rows, split_at=5, space_each=3, left_justify=[True, False]) 

Давать:

A  9 F  25 
B  56 G 999 
C  42   
D  31   
E  31 
+0

Спасибо, мне кажется, что я хочу. Чтобы передать объект 'Series', вам нужно выполнить' my_series.reset_index(). Values'. Может быть, лучший способ пройти серию, но я не мог найти. В любом случае, я подожду, прежде чем принимать, если кто-то придет с другим решением. – jrjc

3

Используя идею show функции (с некоторыми петлями, но поскольку данные, которые могут быть показаны таким образом, малы, это должно быть хорошо).

def show(series, cols=6):               
    rows = int(np.ceil(len(series)/float(cols)))         
    indices = series.index              

    ind_loop = 0                 
    for row in range(rows):              
     ind = indices[ind_loop:ind_loop+cols]          
     dat = series[ind]               
     comb = zip(ind, dat)              
     print_str = ""               
     for num in range(len(dat)):            
      print_str += "{{{0}: <10}} ".format(num)        

     print(print_str.format(*comb))           
     ind_loop += cols               

ser = pd.Series(range(20))                                       
show(ser, cols=6) 

(0, 0)  (1, 1)  (2, 2)  (3, 3)  (4, 4)  (5, 5)      
(6, 6)  (7, 7)  (8, 8)  (9, 9)  (10, 10) (11, 11) 
(12, 12) (13, 13) (14, 14) (15, 15) (16, 16) (17, 17) 
(18, 18) (19, 19) 

Вы можете настроить print, чтобы показать что-то вроде index : value, если вам нравится.