Параметры и настройки
Обзор
pandas имеет систему параметров, которая позволяет настраивать некоторые аспекты его поведения, при этом параметры отображения — это те, которые пользователь, скорее всего, будет корректировать.
Параметры имеют полное «точечное» имя, регистронезависимое (например, display.max_rows). Вы можете получить/установить параметры напрямую как атрибуты верхнего уровня options атрибута:
In [1]: import pandas as pd In [2]: pd.options.display.max_rows Out[2]: 15 In [3]: pd.options.display.max_rows = 999 In [4]: pd.options.display.max_rows Out[4]: 999
Также существует API, состоящий из 5 соответствующих функций, доступных непосредственно из pandas пространства имен:
-
get_option()/set_option()- получение/установка значения одного параметра. -
reset_option()- сброс одного или нескольких параметров до их значения по умолчанию. -
describe_option()- вывести описания одного или нескольких параметров. -
option_context()- выполнить блок кода с набором параметров, которые вернутся к предыдущим настройкам после выполнения.
Примечание: разработчики могут ознакомиться с pandas/core/config.py для получения дополнительной информации.
Все функции выше принимают шаблон регулярных выражений (стиль re.search) в качестве аргумента, и поэтому передача подстроки будет работать — до тех пор, пока она не будет неоднозначной :
In [5]: pd.get_option("display.max_rows")
Out[5]: 999
In [6]: pd.set_option("display.max_rows",101)
In [7]: pd.get_option("display.max_rows")
Out[7]: 101
In [8]: pd.set_option("max_r",102)
In [9]: pd.get_option("display.max_rows")
Out[9]: 102
Следующее не будет работать, потому что оно соответствует нескольким именам параметров, например, display.max_colwidth, display.max_rows, display.max_columns:
In [10]: try:
....: pd.get_option("column")
....: except KeyError as e:
....: print(e)
....:
'Pattern matched multiple keys'
Примечание: использование этого сокращенного формата может привести к тому, что ваш код перестанет работать, если в будущих версиях будут добавлены новые параметры с аналогичными именами.
Вы можете получить список доступных параметров и их описаний с помощью describe_option. При вызове без аргументов describe_option выведет описания всех доступных параметров.
Получение и установка параметров
Как описано выше, get_option() и set_option() доступны из пространства имен pandas. Чтобы изменить параметр, вызовите set_option('option regex', new_value)
In [11]: pd.get_option('mode.sim_interactive')
Out[11]: False
In [12]: pd.set_option('mode.sim_interactive', True)
In [13]: pd.get_option('mode.sim_interactive')
Out[13]: True
Примечание: что параметр «mode.sim_interactive» в основном используется для отладки.
Все параметры также имеют значение по умолчанию, и вы можете использовать reset_option для этого:
In [14]: pd.get_option("display.max_rows")
Out[14]: 60
In [15]: pd.set_option("display.max_rows",999)
In [16]: pd.get_option("display.max_rows")
Out[16]: 999
In [17]: pd.reset_option("display.max_rows")
In [18]: pd.get_option("display.max_rows")
Out[18]: 60
Также возможно сбросить несколько параметров одновременно (используя регулярное выражение):
In [19]: pd.reset_option("^display")
height has been deprecated.
line_width has been deprecated, use display.width instead (currently both are
identical)
option_context контекстный менеджер был экспонирован через верхний API, позволяя вам выполнять код со значениями заданных параметров. Значения параметров автоматически восстанавливаются при выходе из with блока:
In [20]: with pd.option_context("display.max_rows",10,"display.max_columns", 5):
....: print(pd.get_option("display.max_rows"))
....: print(pd.get_option("display.max_columns"))
....:
10
5
In [21]: print(pd.get_option("display.max_rows"))
60
In [22]: print(pd.get_option("display.max_columns"))
20
Установка параметров запуска в среде python/ipython
Использование скриптов запуска для среды python/ipython для импорта pandas и установки параметров делает работу с pandas более эффективной. Для этого создайте скрипт .py или .ipy в папке запуска нужного профиля. Пример, где папка запуска находится в стандартном профиле ipython, можно найти по адресу:
$IPYTHONDIR/profile_default/startup
Дополнительную информацию можно найти в документации ipython. Пример скрипта запуска для pandas показан ниже:
import pandas as pd
pd.set_option('display.max_rows', 999)
pd.set_option('precision', 5)
Часто используемые параметры
Ниже приведён обзор наиболее часто используемых параметров отображения.
display.max_rows и display.max_columns устанавливают максимальное количество строк и столбцов, отображаемых при красивом выводе кадра. Усечённые строки заменяются многоточием.
In [23]: df = pd.DataFrame(np.random.randn(7,2))
In [24]: pd.set_option('max_rows', 7)
In [25]: df
Out[25]:
0 1
0 0.469112 -0.282863
1 -1.509059 -1.135632
2 1.212112 -0.173215
3 0.119209 -1.044236
4 -0.861849 -2.104569
5 -0.494929 1.071804
6 0.721555 -0.706771
In [26]: pd.set_option('max_rows', 5)
In [27]: df
Out[27]:
0 1
0 0.469112 -0.282863
1 -1.509059 -1.135632
.. ... ...
5 -0.494929 1.071804
6 0.721555 -0.706771
[7 rows x 2 columns]
In [28]: pd.reset_option('max_rows')
display.expand_frame_repr позволяет кадрам данных отображаться на нескольких страницах, с переходом по строкам или столбцам.
In [29]: df = pd.DataFrame(np.random.randn(5,10))
In [30]: pd.set_option('expand_frame_repr', True)
In [31]: df
Out[31]:
0 1 2 3 4 5 6 \
0 -1.039575 0.271860 -0.424972 0.567020 0.276232 -1.087401 -0.673690
1 0.404705 0.577046 -1.715002 -1.039268 -0.370647 -1.157892 -1.344312
2 1.643563 -1.469388 0.357021 -0.674600 -1.776904 -0.968914 -1.294524
3 -0.013960 -0.362543 -0.006154 -0.923061 0.895717 0.805244 -1.206412
4 -1.170299 -0.226169 0.410835 0.813850 0.132003 -0.827317 -0.076467
7 8 9
0 0.113648 -1.478427 0.524988
1 0.844885 1.075770 -0.109050
2 0.413738 0.276662 -0.472035
3 2.565646 1.431256 1.340309
4 -1.187678 1.130127 -1.436737
In [32]: pd.set_option('expand_frame_repr', False)
In [33]: df
Out[33]:
0 1 2 3 4 5 6 7 8 9
0 -1.039575 0.271860 -0.424972 0.567020 0.276232 -1.087401 -0.673690 0.113648 -1.478427 0.524988
1 0.404705 0.577046 -1.715002 -1.039268 -0.370647 -1.157892 -1.344312 0.844885 1.075770 -0.109050
2 1.643563 -1.469388 0.357021 -0.674600 -1.776904 -0.968914 -1.294524 0.413738 0.276662 -0.472035
3 -0.013960 -0.362543 -0.006154 -0.923061 0.895717 0.805244 -1.206412 2.565646 1.431256 1.340309
4 -1.170299 -0.226169 0.410835 0.813850 0.132003 -0.827317 -0.076467 -1.187678 1.130127 -1.436737
In [34]: pd.reset_option('expand_frame_repr')
display.large_repr позволяет выбрать, отображать ли фреймы данных, превышающие max_columns или max_rows, как усечённый фрейм или как сводку.
In [35]: df = pd.DataFrame(np.random.randn(10,10))
In [36]: pd.set_option('max_rows', 5)
In [37]: pd.set_option('large_repr', 'truncate')
In [38]: df
Out[38]:
0 1 2 3 4 5 6 \
0 -1.413681 1.607920 1.024180 0.569605 0.875906 -2.211372 0.974466
1 0.545952 -1.219217 -1.226825 0.769804 -1.281247 -0.727707 -0.121306
.. ... ... ... ... ... ... ...
8 -2.484478 -0.281461 0.030711 0.109121 1.126203 -0.977349 1.474071
9 -1.071357 0.441153 2.353925 0.583787 0.221471 -0.744471 0.758527
7 8 9
0 -2.006747 -0.410001 -0.078638
1 -0.097883 0.695775 0.341734
.. ... ... ...
8 -0.064034 -1.282782 0.781836
9 1.729689 -0.964980 -0.845696
[10 rows x 10 columns]
In [39]: pd.set_option('large_repr', 'info')
In [40]: df
Out[40]:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 10 columns):
0 10 non-null float64
1 10 non-null float64
2 10 non-null float64
3 10 non-null float64
4 10 non-null float64
5 10 non-null float64
6 10 non-null float64
7 10 non-null float64
8 10 non-null float64
9 10 non-null float64
dtypes: float64(10)
memory usage: 872.0 bytes
In [41]: pd.reset_option('large_repr')
In [42]: pd.reset_option('max_rows')
display.max_colwidth устанавливает максимальную ширину столбцов. Ячейки такой или большей длины будут усечены многоточием.
In [43]: df = pd.DataFrame(np.array([['foo', 'bar', 'bim', 'uncomfortably long string'],
....: ['horse', 'cow', 'banana', 'apple']]))
....:
In [44]: pd.set_option('max_colwidth',40)
In [45]: df
Out[45]:
0 1 2 3
0 foo bar bim uncomfortably long string
1 horse cow banana apple
In [46]: pd.set_option('max_colwidth', 6)
In [47]: df
Out[47]:
0 1 2 3
0 foo bar bim un...
1 horse cow ba... apple
In [48]: pd.reset_option('max_colwidth')
display.max_info_columns устанавливает порог, при котором будет предоставляться информация по столбцам.
In [49]: df = pd.DataFrame(np.random.randn(10,10))
In [50]: pd.set_option('max_info_columns', 11)
In [51]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 10 columns):
0 10 non-null float64
1 10 non-null float64
2 10 non-null float64
3 10 non-null float64
4 10 non-null float64
5 10 non-null float64
6 10 non-null float64
7 10 non-null float64
8 10 non-null float64
9 10 non-null float64
dtypes: float64(10)
memory usage: 872.0 bytes
In [52]: pd.set_option('max_info_columns', 5)
In [53]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Columns: 10 entries, 0 to 9
dtypes: float64(10)
memory usage: 872.0 bytes
In [54]: pd.reset_option('max_info_columns')
display.max_info_rows: df.info() обычно отображает количество пропущенных значений для каждого столбца. Для больших фреймов это может быть довольно медленным. max_info_rows и max_info_cols ограничивают эту проверку только на фреймах с меньшими размерами, чем указано. Обратите внимание, что вы можете указать параметр df.info(null_counts=True) для переопределения при отображении конкретного фрейма.
In [55]: df =pd.DataFrame(np.random.choice([0,1,np.nan], size=(10,10)))
In [56]: df
Out[56]:
0 1 2 3 4 5 6 7 8 9
0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 NaN 1.0 NaN
1 1.0 NaN 0.0 0.0 1.0 1.0 NaN 1.0 0.0 1.0
2 NaN NaN NaN 1.0 1.0 0.0 NaN 0.0 1.0 NaN
3 0.0 1.0 1.0 NaN 0.0 NaN 1.0 NaN NaN 0.0
4 0.0 1.0 0.0 0.0 1.0 0.0 0.0 NaN 0.0 0.0
5 0.0 NaN 1.0 NaN NaN NaN NaN 0.0 1.0 NaN
6 0.0 1.0 0.0 0.0 NaN 1.0 NaN NaN 0.0 NaN
7 0.0 NaN 1.0 1.0 NaN 1.0 1.0 1.0 1.0 NaN
8 0.0 0.0 NaN 0.0 NaN 1.0 0.0 0.0 NaN NaN
9 NaN NaN 0.0 NaN NaN NaN 0.0 1.0 1.0 NaN
In [57]: pd.set_option('max_info_rows', 11)
In [58]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 10 columns):
0 8 non-null float64
1 5 non-null float64
2 8 non-null float64
3 7 non-null float64
4 5 non-null float64
5 7 non-null float64
6 6 non-null float64
7 6 non-null float64
8 8 non-null float64
9 3 non-null float64
dtypes: float64(10)
memory usage: 872.0 bytes
In [59]: pd.set_option('max_info_rows', 5)
In [60]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 10 columns):
0 float64
1 float64
2 float64
3 float64
4 float64
5 float64
6 float64
7 float64
8 float64
9 float64
dtypes: float64(10)
memory usage: 872.0 bytes
In [61]: pd.reset_option('max_info_rows')
display.precision задает точность отображения вывода в десятичных знаках. Это лишь рекомендация.
In [62]: df = pd.DataFrame(np.random.randn(5,5))
In [63]: pd.set_option('precision',7)
In [64]: df
Out[64]:
0 1 2 3 4
0 -2.0490276 2.8466122 -1.2080493 -0.4503923 2.4239054
1 0.1211080 0.2669165 0.8438259 -0.2225400 2.0219807
2 -0.7167894 -2.2244851 -1.0611370 -0.2328247 0.4307933
3 -0.6654779 1.8298075 -1.4065093 1.0782481 0.3227741
4 0.2003243 0.8900241 0.1948132 0.3516326 0.4488815
In [65]: pd.set_option('precision',4)
In [66]: df
Out[66]:
0 1 2 3 4
0 -2.0490 2.8466 -1.2080 -0.4504 2.4239
1 0.1211 0.2669 0.8438 -0.2225 2.0220
2 -0.7168 -2.2245 -1.0611 -0.2328 0.4308
3 -0.6655 1.8298 -1.4065 1.0782 0.3228
4 0.2003 0.8900 0.1948 0.3516 0.4489
display.chop_threshold задаёт уровень, до которого pandas округляет до нуля при отображении ряда или фрейма данных. Обратите внимание, что это не влияет на точность хранения числа.
In [67]: df = pd.DataFrame(np.random.randn(6,6))
In [68]: pd.set_option('chop_threshold', 0)
In [69]: df
Out[69]:
0 1 2 3 4 5
0 -0.1979 0.9657 -1.5229 -0.1166 0.2956 -1.0477
1 1.6406 1.9058 2.7721 0.0888 -1.1442 -0.6334
2 0.9254 -0.0064 -0.8204 -0.6009 -1.0393 0.8248
3 -0.8241 -0.3377 -0.9278 -0.8401 0.2485 -0.1093
4 0.4320 -0.4607 0.3365 -3.2076 -1.5359 0.4098
5 -0.6731 -0.7411 -0.1109 -2.6729 0.8645 0.0609
In [70]: pd.set_option('chop_threshold', .5)
In [71]: df
Out[71]:
0 1 2 3 4 5
0 0.0000 0.9657 -1.5229 0.0000 0.0000 -1.0477
1 1.6406 1.9058 2.7721 0.0000 -1.1442 -0.6334
2 0.9254 0.0000 -0.8204 -0.6009 -1.0393 0.8248
3 -0.8241 0.0000 -0.9278 -0.8401 0.0000 0.0000
4 0.0000 0.0000 0.0000 -3.2076 -1.5359 0.0000
5 -0.6731 -0.7411 0.0000 -2.6729 0.8645 0.0000
In [72]: pd.reset_option('chop_threshold')
display.colheader_justify управляет выравниванием заголовков. Доступны варианты «право» и «лево».
In [73]: df = pd.DataFrame(np.array([np.random.randn(6), np.random.randint(1,9,6)*.1, np.zeros(6)]).T,
....: columns=['A', 'B', 'C'], dtype='float')
....:
In [74]: pd.set_option('colheader_justify', 'right')
In [75]: df
Out[75]:
A B C
0 0.9331 0.3 0.0
1 0.2888 0.2 0.0
2 1.3250 0.2 0.0
3 0.5892 0.7 0.0
4 0.5314 0.1 0.0
5 -1.1987 0.7 0.0
In [76]: pd.set_option('colheader_justify', 'left')
In [77]: df
Out[77]:
A B C
0 0.9331 0.3 0.0
1 0.2888 0.2 0.0
2 1.3250 0.2 0.0
3 0.5892 0.7 0.0
4 0.5314 0.1 0.0
5 -1.1987 0.7 0.0
In [78]: pd.reset_option('colheader_justify')
Доступные параметры
| Параметр | Значение по умолчанию | Функция |
|---|---|---|
| display.chop_threshold | None | Если установлено значение с плавающей точкой, все значения с плавающей точкой, меньшие заданного порога, будут отображаться как точно 0 функциями repr и аналогичными. |
| display.colheader_justify | right | Управляет выравниванием заголовков столбцов. Используется DataFrameFormatter. |
| display.column_space | 12 | Описание отсутствует. |
| display.date_dayfirst | False | Если True, печатает и анализирует даты с днём впереди, например 20/01/2005 |
| display.date_yearfirst | False | Если True, печатает и анализирует даты с годом впереди, например 2005/01/20 |
| display.encoding | UTF-8 | По умолчанию используется детекция кодировки консоли. Устанавливает кодировку, используемую для строк, возвращаемых методом to_string; эти строки обычно предназначены для отображения в консоли. |
| display.expand_frame_repr | True | Выводить полное представление DataFrame для широких DataFrame на нескольких строках. max_columns всё ещё учитывается, но вывод будет переноситься на несколько «страниц», если его ширина превысит display.width. |
| display.float_format | None | Функция должна принимать число с плавающей точкой и возвращать строку с желаемым форматом числа. Используется в некоторых местах, таких как SeriesFormatter. См. core.format.EngFormatter для примера. |
| display.height | 60 | Устаревшее. Используйте display.max_rows вместо этого. |
| display.large_repr | truncate | Для DataFrame, превышающих max_rows/max_cols, представление (и HTML-представление) может отображать усечённую таблицу (значение по умолчанию с версии 0.13) или переключаться на представление из df.info() (поведение в более ранних версиях pandas). Допустимые значения: [‘truncate’, ‘info’] |
| display.latex.repr | False | Создавать ли представление DataFrame в формате LaTeX для jupyter-фронтенов, которые его поддерживают. |
| display.latex.escape | True | Экранировать специальные символы в DataFrame при использовании метода to_latex. |
| display.latex.longtable | False | Указывает, использует ли метод to_latex DataFrame формат longtable. |
| display.line_width | 80 | Устаревшее. Используйте display.width вместо этого. |
| display.max_columns | 20 | max_rows и max_columns используются в методах __repr__() для определения, использовать ли to_string() или info(), чтобы отобразить объект в строке. Если python/IPython работает в терминале, это значение можно установить в 0, и pandas будет правильно определять ширину терминала и переключаться на более компактный формат, если все столбцы не помещаются вертикально. IPython notebook, IPython qtconsole или IDLE не работают в терминале, поэтому правильная автоматическая детекция невозможна. Значение ‘None’ означает неограниченное количество. |
| display.max_colwidth | 50 | Максимальная ширина столбца в символах в представлении pandas-структуры данных. При переполнении столбца в выводе встраивается маркер «…». |
| display.max_info_columns | 100 | max_info_columns используется в методе DataFrame.info для определения, будет ли выводиться информация по каждому столбцу. |
| display.max_info_rows | 1690785 | df.info() обычно показывает количество пропущенных значений (null) для каждого столбца. Для больших таблиц это может быть довольно медленным. max_info_rows и max_info_cols ограничивают этот контроль на предмет пропущенных значений только для таблиц с размерами меньше указанных. |
| display.max_rows | 60 | Это устанавливает максимальное количество строк, которое pandas должен выводить при выводе различных результатов. Например, это значение определяет, выводит ли repr() DataFrame полностью или только сводное представление. Значение ‘None’ означает неограниченное количество. |
| display.max_seq_items | 100 | При красивой печати длинной последовательности печатается не более max_seq_items элементов. Если элементы опущены, они обозначаются добавлением «…» в результирующую строку. Если установлено None, количество печатаемых элементов не ограничено. |
| display.memory_usage | True | Указывает, следует ли отображать использование памяти DataFrame при вызове метода df.info(). |
| display.multi_sparse | True | «Уплотнять» отображение MultiIndex (не отображать повторяющиеся элементы во внешних уровнях в группах). |
| display.notebook_repr_html | True | Если True, IPython notebook будет использовать html-представление для объектов pandas (если оно доступно). |
| display.pprint_nest_depth | 3 | Управляет количеством вложенных уровней для обработки при красивой печати. |
| display.precision | 6 | Точность вывода чисел с плавающей точкой в виде количества знаков после десятичной точки, как для обычного форматирования, так и для экспоненциальной записи. Аналогично опции печати precision numpy. |
| display.show_dimensions | truncate | Определяет, следует ли печатать размеры в конце представления DataFrame. Если задано ‘truncate’, выводить размеры только если таблица усечена (т. е. не отображаются все строки и/или столбцы). |
| display.width | 80 | Ширина отображения в символах. Если python/IPython работает в терминале, это значение можно установить в None, и pandas будет правильно определять ширину. Обратите внимание, что IPython notebook, IPython qtconsole или IDLE не работают в терминале, поэтому правильная детекция ширины невозможна. |
| html.border | 1 | Атрибут border=value вставлен в тег <table> для HTML-представления DataFrame. |
| io.excel.xls.writer | xlwt | Двигатель записи по умолчанию для файлов «xls». |
| io.excel.xlsm.writer | openpyxl | Двигатель записи по умолчанию для файлов «xlsm». Доступные варианты: ‘openpyxl’ (по умолчанию). |
| io.excel.xlsx.writer | openpyxl | Двигатель записи по умолчанию для файлов «xlsx». |
| io.hdf.default_format | None | Формат записи по умолчанию, если None, то put будет по умолчанию ‘fixed’, а append — ‘table’. |
| io.hdf.dropna_table | True | Удалять ВСЕ строки с NaN при добавлении в таблицу. |
| mode.chained_assignment | warn | Вызывать исключение, предупреждение или без действия при попытке использовать цепочку присваиваний. По умолчанию — предупреждение. |
| mode.sim_interactive | False | Имитировать интерактивный режим для целей тестирования |
| mode.use_inf_as_null | False | True означает, что None, NaN, -INF, INF будут считаться null (старый способ), False означает, что None и NaN — null, но INF, -INF — не null (новый способ). |
Форматирование чисел
pandas также позволяет настраивать отображение чисел в консоли. Этот параметр не настраивается через API set_options.
Используйте функцию set_eng_float_format для изменения форматирования чисел с плавающей точкой в объектах pandas, чтобы получить определённый формат.
Например:
In [79]: import numpy as np In [80]: pd.set_eng_float_format(accuracy=3, use_eng_prefix=True) In [81]: s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) In [82]: s/1.e3 Out[82]: a -236.866u b 846.974u c -685.597u d 609.099u e -303.961u dtype: float64 In [83]: s/1.e6 Out[83]: a -236.866n b 846.974n c -685.597n d 609.099n e -303.961n dtype: float64
Для округления чисел с плавающей точкой в каждом конкретном случае можно также использовать round() и round().
Форматирование Unicode
Предупреждение
Включение этого параметра повлияет на производительность печати DataFrame и Series (примерно в 2 раза медленнее). Используйте только в случае реальной необходимости.
В некоторых странах Восточной Азии используются символы Unicode, ширина которых соответствует 2 буквам. Если DataFrame или Series содержат эти символы, то стандартный вывод не может быть правильно выровнен.
Примечание
Для каждого вывода прикреплены скриншоты, демонстрирующие фактические результаты.
In [84]: df = pd.DataFrame({u'国籍': ['UK', u'日本'], u'名前': ['Alice', u'しのぶ']})
In [85]: df;
Включение display.unicode.east_asian_width позволяет pandas проверять свойство «Восточноазиатской ширины» каждого символа. Эти символы можно правильно выровнять, проверив это свойство, но это займет больше времени, чем стандартная функция len.
In [86]: pd.set_option('display.unicode.east_asian_width', True)
In [87]: df;
Кроме того, Unicode содержит символы, ширина которых «неопределённая». Ширина этих символов должна быть либо 1, либо 2 в зависимости от настроек терминала или кодировки. Поскольку это невозможно определить из Python, добавлена опция display.unicode.ambiguous_as_wide, чтобы обработать это.
По умолчанию ширина символа «неопределённой» ширины «¡» (обратный знак восклицания) в примере ниже считается равной 1.
In [88]: df = pd.DataFrame({'a': ['xxx', u'¡¡'], 'b': ['yyy', u'¡¡']})
In [89]: df;
Включение display.unicode.ambiguous_as_wide позволяет pandas определить ширину этих символов как 2. Обратите внимание, что эта опция будет эффективна только при включённом display.unicode.east_asian_width. Подтвердите, что начальная позиция изменилась, но выравнивание не выполняется должным образом из-за несоответствия настроек с этой средой.
In [90]: pd.set_option('display.unicode.ambiguous_as_wide', True)
In [91]: df;
© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/0.19.2/options.html