팬더 데이터 프레임 예쁜 인쇄


113

다음과 같이 pandas 데이터 프레임을 멋진 텍스트 기반 테이블로 어떻게 인쇄 할 수 있습니까?

+------------+---------+-------------+
| column_one | col_two |   column_3  |
+------------+---------+-------------+
|          0 |  0.0001 | ABCD        |
|          1 |  1e-005 | ABCD        |
|          2 |  1e-006 | long string |
|          3 |  1e-007 | ABCD        |
+------------+---------+-------------+

답변:


181

저는 그 요구에 맞는 훌륭한 도구를 찾았습니다 . tabulate 라고 합니다.

표 형식의 데이터를 인쇄하고 DataFrame.

from tabulate import tabulate
import pandas as pd

df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
                   'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
print(tabulate(df, headers='keys', tablefmt='psql'))

+----+-----------+-------------+
|    |   col_two | column_3    |
|----+-----------+-------------|
|  0 |    0.0001 | ABCD        |
|  1 |    1e-05  | ABCD        |
|  2 |    1e-06  | long string |
|  3 |    1e-07  | ABCD        |
+----+-----------+-------------+

노트 :

모든 유형의 데이터에 대한 행 인덱스를 제외하려면 showindex="never"또는을 전달하십시오 showindex=False.


5
블리딩 에지에 액세스 할 수없는 경우 tabulate([list(row) for row in df.values], headers=list(df.columns))인덱스를 제거 할 수 있습니다.
Pedro M Duarte

1
행 인덱스와 열에 계층이있는 경우 잘 작동하지 않습니다.
Siddharth

print(tabulate(df, **kwargs))단순히 그렇게하지 마십시오 tabulate(df, **kwargs). 모든 새로운 라인을 보여줍니다 후자 \n....
인 Dror

6
왼쪽 인덱스 열을 억제하려면 다음을 추가 할 수도 있습니다showindex=False
Arthur


17

판다> = 1.0

내장 함수가 데이터를 일부 github 마크 다운으로 덤프하려면 이제 하나가 있습니다. 보세요 to_markdown:

df = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=['a', 'a', 'b'])  
print(df.to_markdown()) 

|    |   A |   B |
|:---|----:|----:|
| a  |   1 |   1 |
| a  |   2 |   2 |
| b  |   3 |   3 |

다음은 github에서 어떻게 보이는지입니다.

여기에 이미지 설명 입력

여전히 tabulate패키지를 설치 해야합니다 .


16

Jupyter 노트북을 사용하는 경우 다음 코드를 실행하여 올바른 형식의 테이블에 데이터 프레임을 대화식으로 표시 할 수 있습니다.

이 답변은 위의 to_html ( 'temp.html') 답변을 기반으로하지만 파일을 만드는 대신 노트북에 올바른 형식의 테이블을 직접 표시합니다.

from IPython.display import display, HTML

display(HTML(df.to_html()))

이 코드에 대한 크레딧 : iPython Notebook의 테이블로 DataFrame 표시


15

prettytable 을 사용하여 테이블을 텍스트로 렌더링 할 수 있습니다 . 트릭은 data_frame을 메모리 내 csv 파일로 변환하고 꽤 잘 읽도록하는 것입니다. 코드는 다음과 같습니다.

from StringIO import StringIO
import prettytable    

output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt

이것은 어떤 버전의 판다입니까?
WAF

4
AFAIK prettytable는 주로 포기한 것으로 간주됩니다. 좋은 패키지 였기 때문에 부끄럽습니다. :(
dmn

@dmn 그래서 더 이상 유지되지 않습니까?
muon

prettytable2013 년 4 월 6 일 이후로 출시되지 않았습니다. tabulate영적인 전임자이며 정기 출시가 있으며 가장 최근 출시일 은 2019
noddy

7

나는 잠시 동안 Ofer의 대답을 사용했으며 대부분의 경우 훌륭하다는 것을 알았습니다. 안타깝게도 pandas의 to_csvprettytable 의 from_csv 사이 불일치로 인해 prettytable을 다른 방식으로 사용해야했습니다.

실패 사례 중 하나는 쉼표가 포함 된 데이터 프레임입니다.

pd.DataFrame({'A': [1, 2], 'B': ['a,', 'b']})

Prettytable은 다음과 같은 형식의 오류를 발생시킵니다.

Error: Could not determine delimiter

다음 함수는이 경우를 처리합니다.

def format_for_print(df):    
    table = PrettyTable([''] + list(df.columns))
    for row in df.itertuples():
        table.add_row(row)
    return str(table)

색인에 관심이 없으면 다음을 사용하십시오.

def format_for_print2(df):    
    table = PrettyTable(list(df.columns))
    for row in df.itertuples():
        table.add_row(row[1:])
    return str(table)

안녕하세요,이 format_for_print()함수는 Pandas DataFrame의 색인을 인쇄하지 않는 것 같습니다. 색인을 사용하여 설정 df.index.name = 'index'했지만 이름이있는 색인 열을 인쇄하지 않습니다.
edesz

2

Mark의 답변에 따라 어떤 이유로 Jupyter를 사용 하지 않는 경우 ( 예 : 콘솔에서 빠른 테스트를 수행하려는 경우) DataFrame.to_string적어도 Pandas 0.12 (2014)부터 작동 하는 방법을 사용할 수 있습니다. .

import pandas as pd

matrix = [(1, 23, 45), (789, 1, 23), (45, 678, 90)]
df = pd.DataFrame(matrix, columns=list('abc'))
print(df.to_string())

#  outputs:
#       a    b   c
#  0    1   23  45
#  1  789    1  23
#  2   45  678  90

0

아마도 다음과 같은 것을 찾고있을 것입니다.

def tableize(df):
    if not isinstance(df, pd.DataFrame):
        return
    df_columns = df.columns.tolist() 
    max_len_in_lst = lambda lst: len(sorted(lst, reverse=True, key=len)[0])
    align_center = lambda st, sz: "{0}{1}{0}".format(" "*(1+(sz-len(st))//2), st)[:sz] if len(st) < sz else st
    align_right = lambda st, sz: "{0}{1} ".format(" "*(sz-len(st)-1), st) if len(st) < sz else st
    max_col_len = max_len_in_lst(df_columns)
    max_val_len_for_col = dict([(col, max_len_in_lst(df.iloc[:,idx].astype('str'))) for idx, col in enumerate(df_columns)])
    col_sizes = dict([(col, 2 + max(max_val_len_for_col.get(col, 0), max_col_len)) for col in df_columns])
    build_hline = lambda row: '+'.join(['-' * col_sizes[col] for col in row]).join(['+', '+'])
    build_data = lambda row, align: "|".join([align(str(val), col_sizes[df_columns[idx]]) for idx, val in enumerate(row)]).join(['|', '|'])
    hline = build_hline(df_columns)
    out = [hline, build_data(df_columns, align_center), hline]
    for _, row in df.iterrows():
        out.append(build_data(row.tolist(), align_right))
    out.append(hline)
    return "\n".join(out)


df = pd.DataFrame([[1, 2, 3], [11111, 22, 333]], columns=['a', 'b', 'c'])
print tableize(df)
산출:
+ ------- + ---- + ----- +
| a | b | c |
+ ------- + ---- + ----- +
| 1 | 2 | 3 |
| 11111 | 22 | 333 |
+ ------- + ---- + ----- +

-5

데이터 프레임의 종이 인쇄물을 원했지만 같은 페이지에 결과와 주석도 추가하고 싶었습니다. 나는 위의 과정을 통해 내가 원하는 것을 얻을 수 없었다. 결국 file.write (df1.to_csv ()) 및 file.write ( ",,, blah ,,,,,, blah") 문을 사용하여 페이지에 추가 항목을 표시했습니다. csv 파일을 열었을 때 모든 것을 올바른 속도와 형식으로 인쇄하는 스프레드 시트로 바로 이동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.