Версия 0.7.3 (12 апреля 2012)#

Это минорный релиз от 0.7.2, который исправляет множество мелких ошибок и добавляет ряд хороших новых функций. Также есть пара изменений API, на которые стоит обратить внимание; они не должны затронуть многих пользователей, и мы склонны называть их «исправлениями ошибок», даже если они представляют собой изменение в поведении. См. полные заметки о выпуске или в трекере проблем на GitHub для полного списка.

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

from pandas.tools.plotting import scatter_matrix

scatter_matrix(df, alpha=0.2)  # noqa F821
df.plot(kind="bar", stacked=True)  # noqa F821
df.plot(kind="barh", stacked=True)  # noqa F821

Изменение API для сравнения NA boolean#

Отменены некоторые изменения в обработке значений NA (обычно представленных как NaN или None) обрабатываются в нечисловых Series:

In [1]: series = pd.Series(["Steve", np.nan, "Joe"])

In [2]: series == "Steve"
Out[2]:
0     True
1    False
2    False
Length: 3, dtype: bool

In [3]: series != "Steve"
Out[3]:
0    False
1     True
2     True
Length: 3, dtype: bool

В сравнениях NA / NaN всегда будут проходить как False за исключением != который является True. Будьте очень осторожны с булевой арифметикой, особенно с отрицанием, при наличии данных NA. Возможно, вы захотите добавить явный фильтр NA в операции с булевыми массивами, если вас это беспокоит:

In [4]: mask = series == "Steve"

In [5]: series[mask & series.notnull()]
Out[5]:
0    Steve
Length: 1, dtype: object

Хотя распространение NA в сравнениях может показаться правильным поведением некоторым пользователям (и можно утверждать на чисто технических основаниях, что это правильный подход), было принято решение, что распространение NA повсюду, включая числовые массивы, вызовет множество проблем для пользователей. Таким образом, был принят подход «практичность важнее чистоты». Этот вопрос может быть пересмотрен в будущем.

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

При вызове apply для сгруппированного Series возвращаемое значение также будет Series для большей согласованности с groupby поведение с DataFrame:

In [6]: df = pd.DataFrame(
   ...:     {
   ...:         "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
   ...:         "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
   ...:         "C": np.random.randn(8),
   ...:         "D": np.random.randn(8),
   ...:     }
   ...: )
   ...:

In [7]: df
Out[7]:
   A      B         C         D
0  foo    one  0.469112 -0.861849
1  bar    one -0.282863 -2.104569
2  foo    two -1.509059 -0.494929
3  bar  three -1.135632  1.071804
4  foo    two  1.212112  0.721555
5  bar    two -0.173215 -0.706771
6  foo    one  0.119209 -1.039575
7  foo  three -1.044236  0.271860

[8 rows x 4 columns]

In [8]: grouped = df.groupby("A")["C"]

In [9]: grouped.describe()
Out[9]:
   count      mean       std       min       25%       50%       75%       max
A
bar    3.0 -0.530570  0.526860 -1.135632 -0.709248 -0.282863 -0.228039 -0.173215
foo    5.0 -0.150572  1.113308 -1.509059 -1.044236  0.119209  0.469112  1.212112

[2 rows x 8 columns]

In [10]: grouped.apply(lambda x: x.sort_values()[-2:])  # top 2 values
Out[10]:
A
bar  1   -0.282863
     5   -0.173215
foo  0    0.469112
     4    1.212112
Name: C, Length: 4, dtype: float64

Участники#

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

  • Abraham Flaxman +

  • Adam Klein

  • Andreas H. +

  • Chang She

  • Dieter Vandenbussche

  • Jacques Kvam +

  • K.-Michael Aye +

  • Камиль Кисиль +

  • Martin Blais +

  • Skipper Seabold

  • Томас Клуйвер

  • Wes McKinney

  • Wouter Overmeire

  • Yaroslav Halchenko

  • lgautier +