Wydrukuj bardzo długi ciąg w całości w ramce danych pandy


116

Zmagam się z pozornie bardzo prostą rzeczą, mam ramkę danych pandy zawierającą bardzo długi ciąg.

df = pd.DataFrame({'one' : ['one', 'two', 
      'This is very long string very long string very long string veryvery long string']})

Teraz, gdy próbuję wydrukować to samo, nie widzę całego ciągu, widzę raczej tylko część ciągu.

Próbowałem następujących opcji

  • za pomocą print(df.iloc[2])
  • za pomocą to_html
  • za pomocą to_string
  • Jedna z odpowiedzi stosu przepełnienia stosu sugerowała zwiększenie szerokości kolumny za pomocą opcji wyświetlania pand, która również nie działała.
  • Nie dostałem też, jak set_printoptionsmi pomoże.

Wszelkie pomysły mile widziane. Wygląda bardzo prosto, ale nie jest w stanie tego uzyskać!

Odpowiedzi:


176

Możesz użyć, options.display.max_colwidthaby określić, czy chcesz zobaczyć więcej w domyślnej reprezentacji:

In [2]: df
Out[2]:
                                                 one
0                                                one
1                                                two
2  This is very long string very long string very...

In [3]: pd.options.display.max_colwidth
Out[3]: 50

In [4]: pd.options.display.max_colwidth = 100

In [5]: df
Out[5]:
                                                                               one
0                                                                              one
1                                                                              two
2  This is very long string very long string very long string veryvery long string

I rzeczywiście, jeśli chcesz tylko sprawdzić jedną wartość, uzyskując do niej dostęp (jako wartość skalarną, a nie jako wiersz df.iloc[2]), zobaczysz również pełny ciąg:

In [7]: df.iloc[2,0]    # or df.loc[2,'one']
Out[7]: 'This is very long string very long string very long string veryvery long string'

2
df.iloc [2,0] - nie działa - wydrukuję pierwszy i trzeci wiersz i
— przytnę

Działa, jeśli chcesz element trzeciego rzędu i pierwszej kolumny. Jeśli chcesz czegoś innego, otwórz nowe pytanie.
— joris

To działa, dzięki! Mam listę kodów pocztowych w 1 kolumnie i używam Zastosuj, aby znaleźć minimalną i maksymalną kolumnę mądrą za pomocą funkcji: df ['zipcodeMinMax'] = df.loc [:, ['zipcodeList']]. Apply (createMinMaxZipcode, axis = 1). Więc w ramach funkcji, którą wykonuję to_string w serii (stringZipcodes = zipcodeList.to_string (header = False, index = False)). Dłuższe listy kodów pocztowych kończyły się trzema kropkami, np. „1111 ...”. Rzeczywiście tak się nie dzieje, jeśli wybierzesz wartości na podstawie indeksu i kolumny (jako skalar). Moje pytanie: dlaczego takie zachowanie? Wydaje mi się dziwne ustawienie opcji wyświetlania, aby zastosować wpływ? Dzięki!
— Wouter

1
@Wouter, jeśli masz inne pytanie, lepiej zadaj nowe, zamiast komentować tutaj
— joris,

1
Nie działa to w przypadku większego ciągu, takiego jak akapit z wieloma wierszami.
— devssh

37

Używaj pd.set_option('display.max_colwidth', -1)do automatycznego łamania linii i komórek wieloliniowych.

To świetne źródło informacji o tym, jak w pełni wykorzystać wyświetlacz Jupyters z pandami.


6
pd.set_option('display.max_colwidth', None)dla nowszych wersji
— cookiemonster

To najlepsza odpowiedź
— Clancy

17

Innym, dość prostym podejściem jest wywołanie funkcji listy:

list(df['one'][2])
# output:
['This is very long string very long string very long string veryvery long string']

Nie warto wspominać, że konwent nie jest dobry, aby wymieniać całe kolumny, ale dla prostej linii - dlaczego nie


1
Jeśli zredukowałeś df na podstawie pewnych kryteriów wyszukiwania i sprowadza się do jednej linii, to nie działa. To najprostszy sposób, mimo wszystko do debugowania i chciałbym, żeby to zadziałało, ale nie wiem, dlaczego tak nie jest. Otrzymasz „*** KeyError: 0”. Domyślam się, że ma to związek z byciem „skalarem”, gdy jest tylko jedna wartość.
— Starman

Na dzień dzisiejszy zwraca to wszystkie znaki z zapytaniem do df, które zwraca dwie komórki ze 127 znakami, do których byłem sfrustrowany, próbując dotrzeć. Jeśli to komuś pomoże
— avirr

12

Innym łatwiejszym sposobem wydrukowania całego ciągu jest wywołanie valuesramki danych.

df = pd.DataFrame({'one' : ['one', 'two', 
      'This is very long string very long string very long string veryvery long string']})

print(df.values)

Wynik będzie

[['one']
 ['two']
 ['This is very long string very long string very long string veryvery long string']]

4

Czy to chciałeś zrobić?

In [7]: x =  pd.DataFrame({'one' : ['one', 'two', 'This is very long string very long string very long string veryvery long string']})

In [8]: x
Out[8]: 
                                                 one
0                                                one
1                                                two
2  This is very long string very long string very...

In [9]: x['one'][2]
Out[9]: 'This is very long string very long string very long string veryvery long string'

4

Po prostu dodaj następujący wiersz do kodu przed wydrukowaniem.

 pd.options.display.max_colwidth = 90  # set a value as your need

Możesz po prostu wykonać następujące kroki, aby ustawić inne dodatkowe opcje,

  • Możesz zmienić opcje funkcji max_columns pandy w następujący sposób, aby wyświetlić więcej kolumn

    import pandas as pd
    pd.options.display.max_columns = 10

    (pozwala to wyświetlić 10 kolumn, możesz to zmienić w razie potrzeby)

  • W ten sposób możesz zmienić liczbę wierszy, ponieważ musisz wyświetlić w następujący sposób, aby wyświetlić więcej wierszy

    pd.options.display.max_rows = 999

    (pozwala to na wydrukowanie 999 wierszy jednocześnie)

to powinno działać dobrze

Prosimy o zapoznanie się z dokumentem, aby zmienić więcej opcji / ustawień dla pand


3

Sposób, w jaki często radzę sobie z opisywaną przez Ciebie sytuacją, to użycie .to_csv()metody i napisanie na standardowe wyjście:

import sys

df.to_csv(sys.stdout)

Aktualizacja: teraz powinno być możliwe po prostu użycie Nonezamiast sys.stdoutz podobnym efektem!

Powinno to zrzucić całą ramkę danych, w tym całość wszystkich ciągów. Możesz użyć parametrów to_csv, aby skonfigurować separatory kolumn, czy indeks jest drukowany itp. Będzie to jednak mniej ładne niż prawidłowe renderowanie.

Opublikowałem to pierwotnie w odpowiedzi na nieco powiązane pytanie na stronie Dane wyjściowe ze wszystkich kolumn w ramce danych w pandach


2

Stworzyłem małą funkcję użytkową, która działa dobrze dla mnie

def display_text_max_col_width(df, width):
    with pd.option_context('display.max_colwidth', width):
        print(df)

display_text_max_col_width(train_df["Description"], 800)

Mogę zmienić długość szerokości zgodnie z wymaganiami, bez ustawiania na stałe żadnej opcji.


1

Jeśli używasz notatnika jupyter, możesz również wydrukować ramkę danych pandy jako tabelę HTML, która wydrukuje pełne ciągi.

from IPython.display import display, HTML
display(HTML(df.to_html()))

Wynik

    one
0   one
1   two
2   This is very long string very long string very long string veryvery long string
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.