Версия 0.16.0 (22 марта 2015)#

Это основной выпуск с версии 0.15.2 и включает небольшое количество изменений API, несколько новых функций, улучшений и улучшений производительности, а также большое количество исправлений ошибок. Мы рекомендуем всем пользователям обновиться до этой версии.

Основные моменты включают:

  • DataFrame.assign метод, см. здесь

  • Series.to_coo/from_coo методы для взаимодействия с scipy.sparse, см. здесь

  • Обратно несовместимое изменение для Timedelta чтобы соответствовать .seconds атрибут с datetime.timedelta, см. здесь

  • Изменения в .loc API срезов для соответствия поведению .ix см. здесь

  • Изменения в значении по умолчанию для упорядочивания в Categorical конструктор, см. здесь

  • Улучшение .str аксессор для упрощения строковых операций, см. здесь

  • The pandas.tools.rplot, pandas.sandbox.qtpandas и pandas.rpy Модули устарели. Мы рекомендуем пользователям обращаться к внешним пакетам, таким как seaborn, pandas-qt и rpy2 для аналогичной или эквивалентной функциональности, см. здесь

Проверьте Изменения API и устаревшие возможности перед обновлением.

Новые возможности#

DataFrame assign#

Вдохновлено dplyr's mutate глагол, DataFrame имеет новый assign() метод. Сигнатура функции для assign просто **kwargs. Ключи - это имена столбцов для новых полей, а значения - либо значение для вставки (например, Series или массив NumPy), или функция одного аргумента, которая будет вызвана на DataFrame. Новые значения вставляются, и возвращается весь DataFrame (со всеми исходными и новыми столбцами).

In [1]: iris = pd.read_csv('data/iris.data')

In [2]: iris.head()
Out[2]: 
   SepalLength  SepalWidth  PetalLength  PetalWidth         Name
0          5.1         3.5          1.4         0.2  Iris-setosa
1          4.9         3.0          1.4         0.2  Iris-setosa
2          4.7         3.2          1.3         0.2  Iris-setosa
3          4.6         3.1          1.5         0.2  Iris-setosa
4          5.0         3.6          1.4         0.2  Iris-setosa

[5 rows x 5 columns]

In [3]: iris.assign(sepal_ratio=iris['SepalWidth'] / iris['SepalLength']).head()
Out[3]: 
   SepalLength  SepalWidth  PetalLength  PetalWidth         Name  sepal_ratio
0          5.1         3.5          1.4         0.2  Iris-setosa     0.686275
1          4.9         3.0          1.4         0.2  Iris-setosa     0.612245
2          4.7         3.2          1.3         0.2  Iris-setosa     0.680851
3          4.6         3.1          1.5         0.2  Iris-setosa     0.673913
4          5.0         3.6          1.4         0.2  Iris-setosa     0.720000

[5 rows x 6 columns]

Выше был пример вставки предварительно вычисленного значения. Мы также можем передать функцию для вычисления.

In [4]: iris.assign(sepal_ratio=lambda x: (x['SepalWidth']
   ...:                                    / x['SepalLength'])).head()
   ...: 
Out[4]: 
   SepalLength  SepalWidth  PetalLength  PetalWidth         Name  sepal_ratio
0          5.1         3.5          1.4         0.2  Iris-setosa     0.686275
1          4.9         3.0          1.4         0.2  Iris-setosa     0.612245
2          4.7         3.2          1.3         0.2  Iris-setosa     0.680851
3          4.6         3.1          1.5         0.2  Iris-setosa     0.673913
4          5.0         3.6          1.4         0.2  Iris-setosa     0.720000

[5 rows x 6 columns]

Мощность assign возникает при использовании в цепочках операций. Например, мы можем ограничить DataFrame только теми, у которых длина чашелистика больше 5, вычислить соотношение и построить график

In [5]: iris = pd.read_csv('data/iris.data')

In [6]: (iris.query('SepalLength > 5')
   ...:      .assign(SepalRatio=lambda x: x.SepalWidth / x.SepalLength,
   ...:              PetalRatio=lambda x: x.PetalWidth / x.PetalLength)
   ...:      .plot(kind='scatter', x='SepalRatio', y='PetalRatio'))
   ...: 
Out[6]: 
../_images/whatsnew_assign.png

См. документация для получения дополнительной информации. (GH 9229)

Взаимодействие с scipy.sparse#

Добавлен SparseSeries.to_coo() и SparseSeries.from_coo() методы (GH 8048) для преобразования в и из scipy.sparse.coo_matrix экземпляры (см. здесь). Например, для SparseSeries с MultiIndex можно преобразовать в scipy.sparse.coo_matrix указав метки строк и столбцов как уровни индекса:

s = pd.Series([3.0, np.nan, 1.0, 3.0, np.nan, np.nan])
s.index = pd.MultiIndex.from_tuples([(1, 2, 'a', 0),
                                     (1, 2, 'a', 1),
                                     (1, 1, 'b', 0),
                                     (1, 1, 'b', 1),
                                     (2, 1, 'b', 0),
                                     (2, 1, 'b', 1)],
                                    names=['A', 'B', 'C', 'D'])

s

# SparseSeries
ss = s.to_sparse()
ss

A, rows, columns = ss.to_coo(row_levels=['A', 'B'],
                             column_levels=['C', 'D'],
                             sort_labels=False)

A
A.todense()
rows
columns

Метод from_coo — это удобный метод для создания SparseSeries из scipy.sparse.coo_matrix:

from scipy import sparse
A = sparse.coo_matrix(([3.0, 1.0, 2.0], ([1, 0, 0], [0, 2, 3])),
                      shape=(3, 4))
A
A.todense()

ss = pd.SparseSeries.from_coo(A)
ss

Улучшения строковых методов#

  • Следующие новые методы доступны через .str аксессор для применения функции к каждому значению. Это предназначено для большей согласованности со стандартными методами строк. (GH 9282, GH 9352, GH 9386, GH 9387, GH 9439)

    Методы

    isalnum()

    isalpha()

    isdigit()

    isdigit()

    isspace()

    islower()

    isupper()

    istitle()

    isnumeric()

    isdecimal()

    find()

    rfind()

    ljust()

    rjust()

    zfill()

    In [7]: s = pd.Series(['abcd', '3456', 'EFGH'])
    
    In [8]: s.str.isalpha()
    Out[8]: 
    0     True
    1    False
    2     True
    Length: 3, dtype: bool
    
    In [9]: s.str.find('ab')
    Out[9]: 
    0    0
    1   -1
    2   -1
    Length: 3, dtype: int64
    
  • Series.str.pad() и Series.str.center() теперь принимают fillchar опция для указания заполняющего символа (GH 9352)

    In [10]: s = pd.Series(['12', '300', '25'])
    
    In [11]: s.str.pad(5, fillchar='_')
    Out[11]: 
    0    ___12
    1    __300
    2    ___25
    Length: 3, dtype: object
    
  • Добавлен Series.str.slice_replace(), который ранее вызывал NotImplementedError (GH 8888)

    In [12]: s = pd.Series(['ABCD', 'EFGH', 'IJK'])
    
    In [13]: s.str.slice_replace(1, 3, 'X')
    Out[13]: 
    0    AXD
    1    EXH
    2     IX
    Length: 3, dtype: object
    
    # replaced with empty char
    In [14]: s.str.slice_replace(0, 1)
    Out[14]: 
    0    BCD
    1    FGH
    2     JK
    Length: 3, dtype: object
    

Другие улучшения#

  • Reindex теперь поддерживает method='nearest' для фреймов или серий с монотонно возрастающим или убывающим индексом (GH 9258):

    In [15]: df = pd.DataFrame({'x': range(5)})
    
    In [16]: df.reindex([0.2, 1.8, 3.5], method='nearest')
    Out[16]: 
         x
    0.2  0
    1.8  2
    3.5  4
    
    [3 rows x 1 columns]
    

    Этот метод также доступен на более низком уровне Index.get_indexer и Index.get_loc методы.

  • The read_excel() функции sheetname аргумент теперь принимает список и None, чтобы получить несколько или все листы соответственно. Если указано более одного листа, возвращается словарь. (GH 9450)

    # Returns the 1st and 4th sheet, as a dictionary of DataFrames.
    pd.read_excel('path_to_file.xls', sheetname=['Sheet1', 3])
    
  • Позволить читать файлы Stata постепенно с помощью итератора; поддержка длинных строк в файлах Stata. См. документацию здесь (GH 9493:)

  • Пути, начинающиеся с ~, теперь будут раскрываться, начиная с домашнего каталога пользователя (GH 9066)

  • Добавлен выбор временного интервала в get_data_yahoo (GH 9071)

  • Добавлен Timestamp.to_datetime64() в дополнение к Timedelta.to_timedelta64() (GH 9255)

  • tseries.frequencies.to_offset() теперь принимает Timedelta в качестве входных данных (GH 9064)

  • Параметр лага был добавлен к методу автокорреляции Series, по умолчанию автокорреляция с лагом 1 (GH 9192)

  • Timedelta теперь будет принимать nanoseconds ключевое слово в конструкторе (GH 9273)

  • SQL код теперь безопасно экранирует имена таблиц и столбцов (GH 8986)

  • Добавлено автозаполнение для Series.str., Series.dt. и Series.cat. (GH 9322)

  • Index.get_indexer теперь поддерживает method='pad' и method='backfill' даже для любого целевого массива, не только монотонных целей. Эти методы также работают для монотонно убывающих, а также монотонно возрастающих индексов (GH 9258).

  • Index.asof теперь работает на всех типах индексов (GH 9258).

  • A verbose аргумент был расширен в io.read_excel(), по умолчанию False. Установите True для вывода названий листов по мере их парсинга. (GH 9450)

  • Добавлен days_in_month (псевдоним совместимости daysinmonth) свойство для Timestamp, DatetimeIndex, Period, PeriodIndex, и Series.dt (GH 9572)

  • Добавлен decimal опция в to_csv для предоставления форматирования для десятичных разделителей, отличных от '.' (GH 781)

  • Добавлен normalize опция для Timestamp нормализовано до полуночи (GH 8794)

  • Добавлен пример для DataFrame импорт в R с использованием файла HDF5 и rhdf5 библиотеки. См. документацию для получения дополнительной информации (GH 9636).

Обратно несовместимые изменения API#

Изменения в timedelta#

В v0.15.0 новый скалярный тип Timedelta была представлена, это подкласс datetime.timedelta. Упомянуто здесь было уведомлением об изменении API относительно .seconds аксессор. Цель состояла в предоставлении удобного набора аксессоров, которые дают 'естественное' значение для этой единицы, например, если у вас был Timedelta('1 day, 10:11:12'), затем .seconds вернуло бы 12. Однако это противоречит определению datetime.timedelta, который определяет .seconds как 10 * 3600 + 11 * 60 + 12 == 36672.

Итак, в версии v0.16.0 мы восстанавливаем API, чтобы он соответствовал datetime.timedelta. Кроме того, значения компонентов все еще доступны через .components аксессор. Это влияет на .seconds и .microseconds аксессорами и удаляет .hours, .minutes, .milliseconds аксессоры. Эти изменения затрагивают TimedeltaIndex и Series .dt аксессор также. (GH 9185, GH 9139)

Предыдущее поведение

In [2]: t = pd.Timedelta('1 day, 10:11:12.100123')

In [3]: t.days
Out[3]: 1

In [4]: t.seconds
Out[4]: 12

In [5]: t.microseconds
Out[5]: 123

Новое поведение

In [17]: t = pd.Timedelta('1 day, 10:11:12.100123')

In [18]: t.days
Out[18]: 1

In [19]: t.seconds
Out[19]: 36672

In [20]: t.microseconds
Out[20]: 100123

Используя .components позволяет полный доступ к компонентам

In [21]: t.components
Out[21]: Components(days=1, hours=10, minutes=11, seconds=12, milliseconds=100, microseconds=123, nanoseconds=0)

In [22]: t.components.seconds
Out[22]: 12

Изменения индексации#

Поведение небольшого подмножества крайних случаев при использовании .loc изменились (GH 8613). Кроме того, мы улучшили содержание выдаваемых сообщений об ошибках:

  • Срезы с .loc где начальная и/или конечная граница не найдена в индексе, теперь разрешено; ранее это вызывало KeyError. Это делает поведение таким же, как .ix в данном случае. Это изменение касается только срезов, а не индексации с одной меткой.

    In [23]: df = pd.DataFrame(np.random.randn(5, 4),
       ....:                   columns=list('ABCD'),
       ....:                   index=pd.date_range('20130101', periods=5))
       ....: 
    
    In [24]: df
    Out[24]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    
    [5 rows x 4 columns]
    
    In [25]: s = pd.Series(range(5), [-2, -1, 1, 2, 3])
    
    In [26]: s
    Out[26]: 
    -2    0
    -1    1
     1    2
     2    3
     3    4
    Length: 5, dtype: int64
    

    Предыдущее поведение

    In [4]: df.loc['2013-01-02':'2013-01-10']
    KeyError: 'stop bound [2013-01-10] is not in the [index]'
    
    In [6]: s.loc[-10:3]
    KeyError: 'start bound [-10] is not the [index]'
    

    Новое поведение

    In [27]: df.loc['2013-01-02':'2013-01-10']
    Out[27]: 
                       A         B         C         D
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    
    [4 rows x 4 columns]
    
    In [28]: s.loc[-10:3]
    Out[28]: 
    -2    0
    -1    1
     1    2
     2    3
     3    4
    Length: 5, dtype: int64
    
  • Разрешить срезы с float-подобными значениями на целочисленном индексе для .ix. Ранее это было включено только для .loc:

    Предыдущее поведение

    In [8]: s.ix[-1.0:2]
    TypeError: the slice start value [-1.0] is not a proper indexer for this index type (Int64Index)
    

    Новое поведение

    In [2]: s.ix[-1.0:2]
    Out[2]:
    -1    1
     1    2
     2    3
    dtype: int64
    
  • Предоставить полезное исключение для индексации с недопустимым типом для этого индекса при использовании .loc. Например, попытка использовать .loc на индексе типа DatetimeIndex или PeriodIndex или TimedeltaIndex, с целым числом (или числом с плавающей запятой).

    Предыдущее поведение

    In [4]: df.loc[2:3]
    KeyError: 'start bound [2] is not the [index]'
    

    Новое поведение

    In [4]: df.loc[2:3]
    TypeError: Cannot do slice indexing on  with  keys
    

Изменения в Categorical#

В предыдущих версиях, Categoricals который имел неопределённый порядок (означает отсутствие ordered ключевое слово было передано) по умолчанию устанавливались как ordered Categoricals. В дальнейшем ordered ключевое слово в Categorical конструктор по умолчанию будет использовать False. Порядок теперь должен быть явным.

Кроме того, ранее вы мог изменить ordered атрибут Categorical можно установить напрямую, например cat.ordered=True; Это теперь устарело, и вам следует использовать cat.as_ordered() или cat.as_unordered(). По умолчанию они будут возвращать новый объект и не изменять существующий объект. (GH 9347, GH 9190)

Предыдущее поведение

In [3]: s = pd.Series([0, 1, 2], dtype='category')

In [4]: s
Out[4]:
0    0
1    1
2    2
dtype: category
Categories (3, int64): [0 < 1 < 2]

In [5]: s.cat.ordered
Out[5]: True

In [6]: s.cat.ordered = False

In [7]: s
Out[7]:
0    0
1    1
2    2
dtype: category
Categories (3, int64): [0, 1, 2]

Новое поведение

In [29]: s = pd.Series([0, 1, 2], dtype='category')

In [30]: s
Out[30]: 
0    0
1    1
2    2
Length: 3, dtype: category
Categories (3, int64): [0, 1, 2]

In [31]: s.cat.ordered
Out[31]: False

In [32]: s = s.cat.as_ordered()

In [33]: s
Out[33]: 
0    0
1    1
2    2
Length: 3, dtype: category
Categories (3, int64): [0 < 1 < 2]

In [34]: s.cat.ordered
Out[34]: True

# you can set in the constructor of the Categorical
In [35]: s = pd.Series(pd.Categorical([0, 1, 2], ordered=True))

In [36]: s
Out[36]: 
0    0
1    1
2    2
Length: 3, dtype: category
Categories (3, int64): [0 < 1 < 2]

In [37]: s.cat.ordered
Out[37]: True

Для удобства создания серий категориальных данных мы добавили возможность передачи ключевых слов при вызове .astype(). Они передаются напрямую в конструктор.

In [54]: s = pd.Series(["a", "b", "c", "a"]).astype('category', ordered=True)

In [55]: s
Out[55]:
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a < b < c]

In [56]: s = (pd.Series(["a", "b", "c", "a"])
   ....:        .astype('category', categories=list('abcdef'), ordered=False))

In [57]: s
Out[57]:
0    a
1    b
2    c
3    a
dtype: category
Categories (6, object): [a, b, c, d, e, f]

Другие изменения API#

  • Index.duplicated теперь возвращает np.array(dtype=bool) вместо Index(dtype=object) содержащий bool значения. (GH 8875)

  • DataFrame.to_json теперь возвращает точную сериализацию типа для каждого столбца для фреймов со смешанными типами данных (GH 9037)

    Ранее данные приводились к общему типу данных перед сериализацией, что, например, приводило к сериализации целых чисел в числа с плавающей точкой:

    In [2]: pd.DataFrame({'i': [1,2], 'f': [3.0, 4.2]}).to_json()
    Out[2]: '{"f":{"0":3.0,"1":4.2},"i":{"0":1.0,"1":2.0}}'
    

    Теперь каждый столбец сериализуется с использованием правильного типа данных:

    In [2]:  pd.DataFrame({'i': [1,2], 'f': [3.0, 4.2]}).to_json()
    Out[2]: '{"f":{"0":3.0,"1":4.2},"i":{"0":1,"1":2}}'
    
  • DatetimeIndex, PeriodIndex и TimedeltaIndex.summary теперь выводить в том же формате. (GH 9116)

  • TimedeltaIndex.freqstr теперь выводит тот же строковый формат, что и DatetimeIndex. (GH 9116)

  • Столбчатые и горизонтальные столбчатые диаграммы больше не добавляют пунктирную линию вдоль информационной оси. Предыдущий стиль может быть достигнут с помощью axhline или axvline методы (GH 9088).

  • Series аксессоры .dt, .cat и .str теперь вызывают AttributeError вместо TypeError если серия не содержит данные соответствующего типа (GH 9617). Это более точно следует встроенной иерархии исключений Python и гарантирует, что тесты, такие как hasattr(s, 'cat') совместимы как в Python 2, так и в 3.

  • Series теперь поддерживает побитовые операции для целочисленных типов (GH 9016). Ранее даже если входные типы данных были целочисленными, выходной тип данных приводился к bool.

    Предыдущее поведение

    In [2]: pd.Series([0, 1, 2, 3], list('abcd')) | pd.Series([4, 4, 4, 4], list('abcd'))
    Out[2]:
    a    True
    b    True
    c    True
    d    True
    dtype: bool
    

    Новое поведение. Если входные dtypes являются целочисленными, выходной dtype также целочисленный, и выходные значения являются результатом побитовой операции.

    In [2]: pd.Series([0, 1, 2, 3], list('abcd')) | pd.Series([4, 4, 4, 4], list('abcd'))
    Out[2]:
    a    4
    b    5
    c    6
    d    7
    dtype: int64
    
  • При делении с участием Series или DataFrame, 0/0 и 0//0 теперь дают np.nan вместо np.inf. (GH 9144, GH 8445)

    Предыдущее поведение

    In [2]: p = pd.Series([0, 1])
    
    In [3]: p / 0
    Out[3]:
    0    inf
    1    inf
    dtype: float64
    
    In [4]: p // 0
    Out[4]:
    0    inf
    1    inf
    dtype: float64
    

    Новое поведение

    In [38]: p = pd.Series([0, 1])
    
    In [39]: p / 0
    Out[39]: 
    0    NaN
    1    inf
    Length: 2, dtype: float64
    
    In [40]: p // 0
    Out[40]: 
    0    NaN
    1    inf
    Length: 2, dtype: float64
    
  • Series.values_counts и Series.describe для категориальных данных теперь будет помещать NaN записи в конце. (GH 9443)

  • Series.describe для категориальных данных теперь будут давать подсчеты и частоты 0, а не NaN, для неиспользуемых категорий (GH 9443)

  • Из-за исправления ошибки, поиск частичной строковой метки с DatetimeIndex.asof теперь включает значения, соответствующие строке, даже если они находятся после начала частичной строковой метки (GH 9258).

    Старое поведение:

    In [4]: pd.to_datetime(['2000-01-31', '2000-02-28']).asof('2000-02')
    Out[4]: Timestamp('2000-01-31 00:00:00')
    

    Исправленное поведение:

    In [41]: pd.to_datetime(['2000-01-31', '2000-02-28']).asof('2000-02')
    Out[41]: Timestamp('2000-02-28 00:00:00')
    

    Чтобы воспроизвести старое поведение, просто добавьте больше точности к метке (например, используйте 2000-02-01 вместо 2000-02).

Устаревшие функции#

  • The rplot интерфейс построения графиков trellis устарел и будет удален в будущей версии. Мы рекомендуем внешние пакеты, такие как seaborn для аналогичной но более усовершенствованной функциональности (GH 3445). В документации приведены примеры преобразования существующего кода из rplot в seaborn здесь.

  • The pandas.sandbox.qtpandas интерфейс устарел и будет удален в будущей версии. Мы рекомендуем пользователям обратиться к внешнему пакету pandas-qt. (GH 9615)

  • The pandas.rpy интерфейс устарел и будет удалён в будущей версии. Аналогичную функциональность можно получить через rpy2 проект (GH 9602)

  • Добавление DatetimeIndex/PeriodIndex в другой DatetimeIndex/PeriodIndex устаревает как операция множества. Это будет изменено на TypeError в будущей версии. .union() должен использоваться для операции объединения множеств. (GH 9094)

  • Вычитание DatetimeIndex/PeriodIndex из другого DatetimeIndex/PeriodIndex устаревает как операция над множествами. Это будет изменено на фактическое числовое вычитание, дающее TimeDeltaIndex в будущей версии. .difference() должен использоваться для операции разностного множества. (GH 9094)

Удаление устаревших функций/изменений предыдущих версий#

  • DataFrame.pivot_table и crosstab’s rows и cols именованные аргументы были удалены в пользу index и columns (GH 6581)

  • DataFrame.to_excel и DataFrame.to_csv cols аргумент keyword был удален в пользу columns (GH 6581)

  • Удалено convert_dummies в пользу get_dummies (GH 6581)

  • Удалено value_range в пользу describe (GH 6581)

Улучшения производительности#

  • Исправлена регрессия производительности для .loc индексирование с массивом или списком (GH 9126:)

  • DataFrame.to_json 30-кратное улучшение производительности для фреймов со смешанными типами данных. (GH 9037)

  • Улучшения производительности в MultiIndex.duplicated работая с метками вместо значений (GH 9125)

  • это когда у вас есть коллекция nunique путем вызова unique вместо value_counts (GH 9129, GH 7771)

  • Улучшение производительности до 10 раз в DataFrame.count и DataFrame.dropna путем соответствующего использования однородных/неоднородных типов данных (GH 9136)

  • Улучшение производительности до 20 раз в DataFrame.count при использовании MultiIndex и level аргумент ключевого слова (GH 9163)

  • Улучшения производительности и использования памяти в merge когда пространство ключей превышает int64 bounds (GH 9151)

  • Улучшения производительности при работе с несколькими ключами groupby (GH 9429)

  • Улучшения производительности в MultiIndex.sortlevel (GH 9445)

  • Улучшения производительности и использования памяти в DataFrame.duplicated (GH 9398)

  • Цитонизированный Period (GH 9440)

  • Уменьшено использование памяти на to_hdf (GH 9648)

Исправления ошибок#

  • Изменено .to_html для удаления начальных/конечных пробелов в теле таблицы (GH 4987)

  • Исправлена проблема с использованием read_csv на s3 с Python 3 (GH 9452)

  • Исправлена проблема совместимости в DatetimeIndex затрагивающие архитектуры, где numpy.int_ по умолчанию numpy.int32 (GH 8943)

  • Ошибка в индексировании Panel с объектоподобным (GH 9140)

  • Ошибка в возвращаемом Series.dt.components индекс был сброшен на индекс по умолчанию (GH 9247)

  • Ошибка в Categorical.__getitem__/__setitem__ с вводом в виде списка, дающим некорректные результаты из-за приведения индексатора (GH 9469)

  • Ошибка при частичной установке с DatetimeIndex (GH 9478)

  • Ошибка в groupby для целочисленных и datetime64 столбцов при применении агрегатора, которая приводила к изменению значения, когда число было достаточно большим (GH 9311, GH 6620)

  • Исправлена ошибка в to_sql при отображении Timestamp столбец объекта (datetime столбец с информацией о часовом поясе) в соответствующий тип sqlalchemy (GH 9085).

  • Исправлена ошибка в to_sql dtype аргумент не принимает экземпляр типа SQLAlchemy (GH 9083).

  • Ошибка в .loc частичная установка с np.datetime64 (GH 9516)

  • Некорректные типы данных выведены для дата-временных объектов Series & на .xs срезы (GH 9477)

  • Элементы в Categorical.unique()s.unique() if s имеет тип данных category) теперь отображаются в порядке, в котором они изначально найдены, а не в отсортированном порядке (GH 9331). Теперь это согласуется с поведением для других dtypes в pandas.

  • Исправлена ошибка на платформах с обратным порядком байтов, которая приводила к некорректным результатам в StataReader (GH 8688).

  • Ошибка в MultiIndex.has_duplicates когда большое количество уровней вызывает переполнение индексатора (GH 9075, GH 5873)

  • Ошибка в pivot и unstack где nan значения нарушили бы выравнивание индекса (GH 4862, GH 7401, GH 7403, GH 7405, GH 7466, GH 9497)

  • Ошибка в левом join для MultiIndex с sort=True или нулевые значения (GH 9210).

  • Ошибка в MultiIndex где добавление новых ключей завершилось бы неудачей (GH 9250).

  • Ошибка в groupby когда пространство ключей превышает int64 bounds (GH 9096).

  • Ошибка в unstack с TimedeltaIndex или DatetimeIndex и нулевые значения (GH 9491).

  • Ошибка в rank где сравнение чисел с плавающей точкой с допуском приведет к непоследовательному поведению (GH 8365).

  • Исправлена ошибка кодировки символов в read_stata и StataReader при загрузке данных из URL (GH 9231).

  • Ошибка при добавлении offsets.Nano к другим смещениям вызывает TypeError (GH 9284)

  • Ошибка в DatetimeIndex итерация, связанная с (GH 8890), исправлено в (GH 9100)

  • Ошибки в resample вокруг переходов на летнее время. Это потребовало исправления классов смещения, чтобы они правильно вели себя при переходах на летнее время. (GH 5172, GH 8744, GH 8653, GH 9173, GH 9468).

  • Ошибка в методе бинарного оператора (например .mul()) выравнивание с целочисленными уровнями (GH 9463).

  • Ошибка в boxplot, scatter и hexbin plot может показывать ненужное предупреждение (GH 8877)

  • Ошибка в подграфике с layout kw может показывать ненужное предупреждение (GH 9464)

  • Ошибка при использовании функций группировки, которым требуются передаваемые аргументы (например, axis), при использовании обёрнутой функции (например, fillna), (GH 9221)

  • DataFrame теперь корректно поддерживает одновременное copy и dtype аргументы в конструкторе (GH 9099)

  • Ошибка в read_csv при использовании skiprows в файле с переводами строк CR в движке c. (GH 9079)

  • isnull теперь обнаруживает NaT в PeriodIndex (GH 9129)

  • Ошибка в groupby .nth() с группировкой по нескольким столбцам (GH 8979)

  • Ошибка в DataFrame.where и Series.where принудительно преобразует числа в строки некорректно (GH 9280)

  • Ошибка в DataFrame.where и Series.where raise ValueError когда передаётся список строк. (GH 9280)

  • Доступ к Series.str методы с нестроковыми значениями теперь вызывают TypeError вместо получения некорректных результатов (GH 9184)

  • Ошибка в DatetimeIndex.__contains__ когда индекс имеет дубликаты и не является монотонно возрастающим (GH 9512)

  • Исправлена ошибка деления на ноль для Series.kurt() когда все значения равны (GH 9197)

  • Исправлена проблема в xlsxwriter движок, который добавлял формат 'General' по умолчанию к ячейкам, если не был применён другой формат. Это предотвращало применение другого форматирования строк или столбцов. (GH 9167)

  • Исправлена проблема с index_col=False когда usecols также указан в read_csv. (GH 9082)

  • Ошибка, где wide_to_long изменит входной список заглушек (GH 9204)

  • Ошибка в to_sql не хранит значения float64 с двойной точностью. (GH 9009)

  • SparseSeries и SparsePanel теперь принимают конструкторы с нулевым аргументом (так же, как их неразреженные аналоги) (GH 9272).

  • Регрессия при слиянии Categorical и object типы данных (GH 9426)

  • Ошибка в read_csv с переполнением буфера при определенных поврежденных входных файлах (GH 9205)

  • Ошибка в groupby MultiIndex с отсутствующей парой (GH 9049, GH 9344)

  • Исправлена ошибка в Series.groupby где группировка по MultiIndex уровни игнорировали аргумент сортировки (GH 9444)

  • Исправлена ошибка в DataFrame.Groupby где sort=False игнорируется в случае категориальных столбцов. (GH 8868)

  • Исправлена ошибка при чтении CSV-файлов из Amazon S3 на Python 3, вызывающая TypeError (GH 9452)

  • Ошибка в ридере Google BigQuery, где ключ 'jobComplete' может присутствовать, но иметь значение False в результатах запроса (GH 8728)

  • Ошибка в Series.values_counts с исключением NaN для категориального типа Series с dropna=True (GH 9443)

  • Исправлена отсутствующая опция numeric_only для DataFrame.std/var/sem (GH 9201)

  • Поддержка конструирования Panel или Panel4D со скалярными данными (GH 8285)

  • Series текстовое представление отключено от max_rows/max_columns (GH 7508).

  • Series форматирование чисел несовместимо при усечении (GH 8532).

    Предыдущее поведение

    In [2]: pd.options.display.max_rows = 10
    In [3]: s = pd.Series([1,1,1,1,1,1,1,1,1,1,0.9999,1,1]*10)
    In [4]: s
    Out[4]:
    0    1
    1    1
    2    1
    ...
    127    0.9999
    128    1.0000
    129    1.0000
    Length: 130, dtype: float64
    

    Новое поведение

    0      1.0000
    1      1.0000
    2      1.0000
    3      1.0000
    4      1.0000
    ...
    125    1.0000
    126    1.0000
    127    0.9999
    128    1.0000
    129    1.0000
    dtype: float64
    
  • Ложный SettingWithCopy Предупреждение генерировалось при установке нового элемента во фрейме в некоторых случаях (GH 8730)

    Следующее ранее сообщало о SettingWithCopy Предупреждение.

    In [42]: df1 = pd.DataFrame({'x': pd.Series(['a', 'b', 'c']),
       ....:                     'y': pd.Series(['d', 'e', 'f'])})
       ....: 
    
    In [43]: df2 = df1[['x']]
    
    In [44]: df2['y'] = ['g', 'h', 'i']
    

Участники#

Всего 60 человек внесли патчи в этот релиз. Люди с «+» рядом с именами внесли патч впервые.

  • Aaron Toth +

  • Alan Du +

  • Алессандро Амичи +

  • Artemy Kolchinsky

  • Ashwini Chaudhary +

  • Ben Schiller

  • Bill Letson

  • Брэндон Брэдли +

  • Chau Hoang +

  • Chris Reynolds

  • Chris Whelan +

  • Christer van der Meeren +

  • David Cottrell +

  • David Stephens

  • Ehsan Azarnasab +

  • Garrett-R +

  • Guillaume Gay

  • Jake Torcasso +

  • Jason Sexauer

  • Jeff Reback

  • John McNamara

  • Joris Van den Bossche

  • Joschka zur Jacobsmühlen +

  • Juarez Bochi +

  • Junya Hayashi +

  • K.-Michael Aye

  • Kerby Shedden +

  • Кевин Шеппард

  • Kieran O’Mahony

  • Kodi Arfer +

  • Matti Airas +

  • Min RK +

  • Mortada Mehyar

  • Роберт +

  • Скотт Э. Ласли

  • Scott Lasley +

  • Sergio Pascual +

  • Skipper Seabold

  • Stephan Hoyer

  • Томас Грейнджер

  • Tom Augspurger

  • TomAugspurger

  • Vladimir Filimonov +

  • Вьомкеш Трипати +

  • Will Holmgren

  • Yulong Yang +

  • behzad nouri

  • bertrandhaut +

  • bjonen

  • cel4 +

  • clham

  • hsperr +

  • ischwabacher

  • jnmclarty

  • josham +

  • jreback

  • omtinez +

  • roch +

  • sinhrks

  • unutbu