Jupyter 노트북에서 목록을 테이블로 출력하려면 어떻게해야합니까?


80

전에 어딘가에서 몇 가지 예를 보았지만 내 삶을 위해 인터넷 검색을 할 때 찾을 수 없다는 것을 알고 있습니다.

데이터 행이 있습니다.

data = [[1,2,3],
        [4,5,6],
        [7,8,9],
        ]

이 데이터를 테이블에 출력하고 싶습니다.

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+

분명히 나는 ​​prettytable과 같은 라이브러리를 사용하거나 pandas 등을 다운로드 할 수 있지만 그렇게하는 데는 무관심합니다.

내 행을 Jupyter 노트북 셀의 테이블로 출력하고 싶습니다. 어떻게해야합니까?


print기능 만 사용 하시겠습니까? 숫자는 너비가 고정되어 있습니까 (1 자리, 3 자리 숫자?
tglaria

여기에 비단뱀 추상화를 썼습니다. 번거롭지 않은 코드. :) jupyter_table_class.py
not_python

답변:


85

방금 tabulate 에 HTML 옵션이 있고 사용하기가 다소 간단 하다는 것을 알았습니다 .
Wayne Werner의 답변과 매우 유사합니다.

from IPython.display import HTML, display
import tabulate
table = [["Sun",696000,1989100000],
         ["Earth",6371,5973.6],
         ["Moon",1737,73.5],
         ["Mars",3390,641.85]]
display(HTML(tabulate.tabulate(table, tablefmt='html')))

셀을 병합하고 노트북에서 변수 대체를 수행하기 위해 라텍스 구문 및 서식과 같이 더 복잡한 테이블 레이아웃을 만드는 데 사용하기 쉬운 방법을 찾고 있습니다.
마크 다운 셀에서 Python 변수에 대한 참조 허용 # 2958


문자열 정렬이 작동하지 않았습니다! 문자열을 왼쪽으로 정렬하지 않습니다!
Mojtaba Khodadadi

@MojtabaKhodadadi는 자세히 확인하지 않았지만 여기 에서 srtings 대 숫자에 대한 기본 열 인수를 설정할 수있는 것 같습니다 .
ruffsl

요즘에는 tabulate.tabulate(table, tablefmt='html')작동하는 것처럼 보입니다 (Jupyter 6.0.3, JupyterLab 2.0.1 시도). 좋은!
zonksoft

82

멋진 트릭이 있습니다. 데이터를 pandas DataFrame으로 래핑합니다.

import pandas as pd
data = [[1, 2], [3, 4]]
pd.DataFrame(data, columns=["Foo", "Bar"])

다음과 같은 데이터를 표시합니다.

  | Foo | Bar |
0 | 1   | 2   |
1 | 3   | 4   |

14
모든 것에 대해 파이썬을 절대적으로 좋아하지만 데이터 과학을 좋아하는 사람으로서, 가장보기 좋은 대답이 문자 그대로 "판다 스 데이터 프레임"일 때 9 줄, 4 중 가져 오기, 3 중 함수 호출 응답이 찬성되는 것을 보면 정말 슬프다. 내 휴리스틱은 : "길다면-아마 틀렸을 것입니다!"
one_observation jul.

1
을 사용하여 DataFrame을 HTML로 표시 할 수도 to_html()있습니다. stackoverflow.com/a/29665452/2866660
wvengen

감사! 예, 허용되는 답변은 확실히 이것으로 변경되어야합니다.
Helen

59

마침내 제가 찾고 있던 jupyter / IPython 문서 를 다시 찾았습니다 .

나는 이것이 필요했다 :

from IPython.display import HTML, display

data = [[1,2,3],
        [4,5,6],
        [7,8,9],
        ]

display(HTML(
   '<table><tr>{}</tr></table>'.format(
       '</tr><tr>'.join(
           '<td>{}</td>'.format('</td><td>'.join(str(_) for _ in row)) for row in data)
       )
))

(나는 이해력을 약간 망쳐 놓았을 수도 있지만 display(HTML('some html here'))우리가 필요로했던 것입니다)


13

표 텍스트가 잘 맞습니다.

import tabletext

data = [[1,2,30],
        [4,23125,6],
        [7,8,999],
        ]

print tabletext.to_text(data)

결과:

┌───┬───────┬─────┐
│ 1230 │
├───┼───────┼─────┤
│ 4231256 │
├───┼───────┼─────┤
│ 78999 │
└───┴───────┴─────┘

4

약간의 html을 사용해도 괜찮다면 이와 같은 것이 작동 할 것입니다.

from IPython.display import HTML, display

def display_table(data):
    html = "<table>"
    for row in data:
        html += "<tr>"
        for field in row:
            html += "<td><h4>%s</h4><td>"%(field)
        html += "</tr>"
    html += "</table>"
    display(HTML(html))

그리고 이렇게 사용하세요

data = [[1,2,3],[4,5,6],[7,8,9]]
display_table(data)

여기에 이미지 설명 입력


2

다음 기능을 사용해 볼 수 있습니다.

def tableIt(data):
    for lin in data:
        print("+---"*len(lin)+"+")
        for inlin in lin:
            print("|",str(inlin),"", end="")
        print("|")
    print("+---"*len(lin)+"+")

data = [[1,2,3,2,3],[1,2,3,2,3],[1,2,3,2,3],[1,2,3,2,3]]

tableIt(data)

2

좋아, 그래서 이것은 나보다 조금 더 어려웠다.

def print_matrix(list_of_list):
    number_width = len(str(max([max(i) for i in list_of_list])))
    cols = max(map(len, list_of_list))
    output = '+'+('-'*(number_width+2)+'+')*cols + '\n'
    for row in list_of_list:
        for column in row:
            output += '|' + ' {:^{width}d} '.format(column, width = number_width)
        output+='|\n+'+('-'*(number_width+2)+'+')*cols + '\n'
    return output

이것은 다양한 수의 행, 열 및 자릿수 (숫자)에서 작동합니다.

data = [[1,2,30],
        [4,23125,6],
        [7,8,999],
        ]
print print_matrix(data)
>>>>+-------+-------+-------+
    |   1   |   2   |  30   |
    +-------+-------+-------+
    |   4   | 23125 |   6   |
    +-------+-------+-------+
    |   7   |   8   |  999  |
    +-------+-------+-------+

1

모든 파이썬 데이터 구조 (함께 중첩 된 사전 및 목록)를 HTML로 렌더링하는 범용 함수 세트입니다.

from IPython.display import HTML, display

def _render_list_html(l):
    o = []
    for e in l:
        o.append('<li>%s</li>' % _render_as_html(e))
    return '<ol>%s</ol>' % ''.join(o)

def _render_dict_html(d):
    o = []
    for k, v in d.items():
        o.append('<tr><td>%s</td><td>%s</td></tr>' % (str(k), _render_as_html(v)))
    return '<table>%s</table>' % ''.join(o)

def _render_as_html(e):
    o = []
    if isinstance(e, list):
        o.append(_render_list_html(e))
    elif isinstance(e, dict):
        o.append(_render_dict_html(e))
    else:
        o.append(str(e))
    return '<html><body>%s</body></html>' % ''.join(o)

def render_as_html(e):
    display(HTML(_render_as_html(e)))

1

나는 같은 문제가 있었다. 나는 나를 도울 수있는 것을 찾을 수 없었기 때문에 결국 PrintTable아래 의 클래스 코드를 만들었습니다 . 출력도 있습니다. 사용법은 간단합니다.

ptobj = PrintTable(yourdata, column_captions, column_widths, text_aligns)
ptobj.print()

또는 한 줄로 :

PrintTable(yourdata, column_captions, column_widths, text_aligns).print()

산출:

-------------------------------------------------------------------------------------------------------------
  Name                                     | Column 1   | Column 2   | Column 3   | Column 4   | Column 5    
-------------------------------------------------------------------------------------------------------------
  Very long name 0                         |          0 |          0 |          0 |          0 |          0  
  Very long name 1                         |          1 |          2 |          3 |          4 |          5  
  Very long name 2                         |          2 |          4 |          6 |          8 |         10  
  Very long name 3                         |          3 |          6 |          9 |         12 |         15  
  Very long name 4                         |          4 |          8 |         12 |         16 |         20  
  Very long name 5                         |          5 |         10 |         15 |         20 |         25  
  Very long name 6                         |          6 |         12 |         18 |         24 |         30  
  Very long name 7                         |          7 |         14 |         21 |         28 |         35  
  Very long name 8                         |          8 |         16 |         24 |         32 |         40  
  Very long name 9                         |          9 |         18 |         27 |         36 |         45  
  Very long name 10                        |         10 |         20 |         30 |         40 |         50  
  Very long name 11                        |         11 |         22 |         33 |         44 |         55  
  Very long name 12                        |         12 |         24 |         36 |         48 |         60  
  Very long name 13                        |         13 |         26 |         39 |         52 |         65  
  Very long name 14                        |         14 |         28 |         42 |         56 |         70  
  Very long name 15                        |         15 |         30 |         45 |         60 |         75  
  Very long name 16                        |         16 |         32 |         48 |         64 |         80  
  Very long name 17                        |         17 |         34 |         51 |         68 |         85  
  Very long name 18                        |         18 |         36 |         54 |         72 |         90  
  Very long name 19                        |         19 |         38 |         57 |         76 |         95  
-------------------------------------------------------------------------------------------------------------

수업 코드 PrintTable

# -*- coding: utf-8 -*-

# Class
class PrintTable:
    def __init__(self, values, captions, widths, aligns):
    if not all([len(values[0]) == len(x) for x in [captions, widths, aligns]]):
        raise Exception()
    self._tablewidth = sum(widths) + 3*(len(captions)-1) + 4
    self._values = values
    self._captions = captions
    self._widths = widths
    self._aligns = aligns

    def print(self):
    self._printTable()

    def _printTable(self):
    formattext_head = ""
    formattext_cell = ""
    for i,v in enumerate(self._widths):
        formattext_head += "{" + str(i) + ":<" + str(v) + "} | "
        formattext_cell += "{" + str(i) + ":" + self._aligns[i] + str(v) + "} | "
    formattext_head = formattext_head[:-3]
    formattext_head = "  " + formattext_head.strip() + "  "
    formattext_cell = formattext_cell[:-3]
    formattext_cell = "  " + formattext_cell.strip() + "  "

    print("-"*self._tablewidth)
    print(formattext_head.format(*self._captions))
    print("-"*self._tablewidth)
    for w in self._values:
        print(formattext_cell.format(*w))
    print("-"*self._tablewidth)

데모

# Demonstration

headername = ["Column {}".format(x) for x in range(6)]
headername[0] = "Name"
data = [["Very long name {}".format(x), x, x*2, x*3, x*4, x*5] for x in range(20)] 

PrintTable(data, \
       headername, \
       [70, 10, 10, 10, 10, 10], \
       ["<",">",">",">",">",">"]).print()

1

최근 prettytable에 멋진 ASCII 테이블을 렌더링하는 데 사용 했습니다. postgres CLI 출력과 유사합니다.

import pandas as pd
from prettytable import PrettyTable

data = [[1,2,3],[4,5,6],[7,8,9]]
df = pd.DataFrame(data, columns=['one', 'two', 'three'])

def generate_ascii_table(df):
    x = PrettyTable()
    x.field_names = df.columns.tolist()
    for row in df.values:
        x.add_row(row)
    print(x)
    return x

generate_ascii_table(df)

산출:

+-----+-----+-------+
| one | two | three |
+-----+-----+-------+
|  1  |  2  |   3   |
|  4  |  5  |   6   |
|  7  |  8  |   9   |
+-----+-----+-------+

0

각 열의 너비가 가능한 가장 작은 테이블을 출력하고 싶습니다. 여기서 열은 공백으로 채워지고 (하지만 변경할 수 있음) 행이 줄 바꿈으로 구분되고 (변경 될 수 있음) 각 항목이 str( 그러나...).


def ftable(tbl, pad='  ', sep='\n', normalize=str):

    # normalize the content to the most useful data type
    strtbl = [[normalize(it) for it in row] for row in tbl] 

    # next, for each column we compute the maximum width needed
    w = [0 for _ in tbl[0]]
    for row in strtbl:
        for ncol, it in enumerate(row):
            w[ncol] = max(w[ncol], len(it))

    # a string is built iterating on the rows and the items of `strtbl`:
    #   items are  prepended white space to an uniform column width
    #   formatted items are `join`ed using `pad` (by default "  ")
    #   eventually we join the rows using newlines and return
    return sep.join(pad.join(' '*(wid-len(it))+it for wid, it in zip(w, row))
                                                      for row in strtbl)

ftable(tbl, pad=' ', sep='\n', normalize=str)기본 인수가 있는 함수 시그니처 는 최대한의 유연성을 제공하기위한 것입니다.

사용자 정의 할 수 있습니다.

  • 패딩 ,
  • 9 월 arator (예, pad='&', sep='\\\\\n'라텍스 테이블의 부피를 갖도록)
  • 입력을 공통 문자열 형식 으로 정규화 하는 데 사용되는 함수 --- 기본적으로 최대 일반성을 위해 사용 str되지만 모든 데이터가 부동 소수점이라는 것을 알고 있다면 lambda item: "%.4f"%item합리적인 선택이 될 수 있습니다.

표면 테스트 :

알고리즘이 좀 더 정교 해 지도록 (하지만 약간만;) 다른 너비의 열을 포함하는 테스트 데이터가 필요합니다.

In [1]: from random import randrange

In [2]: table = [[randrange(10**randrange(10)) for i in range(5)] for j in range(3)]

In [3]: table
Out[3]: 
[[974413992, 510, 0, 3114, 1],
 [863242961, 0, 94924, 782, 34],
 [1060993, 62, 26076, 75832, 833174]]

In [4]: print(ftable(table))
974413992  510      0   3114       1
863242961    0  94924    782      34
  1060993   62  26076  75832  833174

In [5]: print(ftable(table, pad='|'))
974413992|510|    0| 3114|     1
863242961|  0|94924|  782|    34
  1060993| 62|26076|75832|833174
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.