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.