版本 0.14.0(2014 年 5 月 31 日)#

这是 0.13.1 的主要版本,包括少量 API 更改、一些新功能、增强功能和性能改进以及大量错误修复。我们建议所有用户升级到此版本。

警告

在 0.14.0 中,所有NDFrame基于容器都经历了重大的内部重构。在此之前,每个同质数据块都有自己的标签,并且需要格外小心以使其与父容器的标签保持同步。这不应该有任何可见的用户/API 行为更改(GH 6745

API 更改#

  • read_excel使用 0 作为默认工作表 ( GH 6573 )

  • iloc现在将接受切片的越界索引器,例如超过正在索引的对象长度的值。这些将被排除在外。这将使 pandas 更符合 python/numpy 越界值索引。超出范围并降低对象尺寸的单个索引器仍会升高 IndexErrorGH 6296GH 6299)。这可能会导致空轴(例如返回空的 DataFrame)

    In [1]: dfl = pd.DataFrame(np.random.randn(5, 2), columns=list('AB'))
    
    In [2]: dfl
    Out[2]: 
              A         B
    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 rows x 2 columns]
    
    In [3]: dfl.iloc[:, 2:3]
    Out[3]: 
    Empty DataFrame
    Columns: []
    Index: [0, 1, 2, 3, 4]
    
    [5 rows x 0 columns]
    
    In [4]: dfl.iloc[:, 1:3]
    Out[4]: 
              B
    0 -0.282863
    1 -1.135632
    2 -0.173215
    3 -1.044236
    4 -2.104569
    
    [5 rows x 1 columns]
    
    In [5]: dfl.iloc[4:6]
    Out[5]: 
              A         B
    4 -0.861849 -2.104569
    
    [1 rows x 2 columns]
    

    这些都是越界选择

    >>> dfl.iloc[[4, 5, 6]]
    IndexError: positional indexers are out-of-bounds
    
    >>> dfl.iloc[:, 4]
    IndexError: single positional indexer is out-of-bounds
    
  • 使用负开始、停止和步长值进行切片可以更好地处理极端情况(GH 6531):

    • df.iloc[:-len(df)]现在是空的

    • df.iloc[len(df)::-1]现在反向枚举所有元素

  • 关键字DataFrame.interpolate()defaultdowncast已从 更改inferNone。这是为了保留原始数据类型,除非另有明确要求(GH 6290)。

  • 将数据帧转换为 HTML 时,它通常返回.这种特殊情况已被删除,而是返回带有列名的标题(GH 6062)。Empty DataFrame

  • Series现在Index内部共享更多通用操作,例如现在也factorize(),nunique(),value_counts()支持类型。为了 API 一致性,从系列中删除了属性 from Index。在 Series 上Series.weekday使用方法现在将引发. (GH 4551GH 4056GH 5519GH 6380GH 7206)。DatetimeIndex/PeriodIndexTypeError

  • 为/添加is_month_start, is_month_end, is_quarter_start, is_quarter_end, is_year_start,is_year_end访问器,返回一个布尔数组,指示时间戳是否位于由/的频率定义的月/季度/年的开始/结束(GH 4565GH 6998DateTimeIndexTimestampDateTimeIndexTimestamp

  • pandas.eval()// ( GH 5987DataFrame.eval() ) 中的局部变量用法已更改 。对于方法,有两件事发生了变化DataFrame.query()DataFrame

    • 列名称现在优先于本地名称

    • 局部变量必须显式引用。这意味着即使您有一个不是的局部变量,您仍然必须使用前缀引用它'@'

    • 你可以有这样的表达,没有抱怨名字的歧义。df.query('@a < a')pandasa

    • 顶级pandas.eval()函数不允许您使用前缀, '@'并会提供一条错误消息告诉您这一点。

    • NameResolutionError已被删除,因为不再需要了。

  • 定义并记录查询/评估中列与索引名称的顺序(GH 6676

  • concat现在将根据需要使用系列名称或编号列连接混合系列和数据帧(GH 2385)。请参阅文档

  • Index对类以及方法的切片Index.delete()和高级/布尔索引操作Index.drop()将不再更改结果索引的类型(GH 6440GH 7040

    In [6]: i = pd.Index([1, 2, 3, 'a', 'b', 'c'])
    
    In [7]: i[[0, 1, 2]]
    Out[7]: Index([1, 2, 3], dtype='object')
    
    In [8]: i.drop(['a', 'b', 'c'])
    Out[8]: Index([1, 2, 3], dtype='object')
    

    以前,上述操作将返回Int64Index.如果您想手动执行此操作,请使用Index.astype()

    In [9]: i[[0, 1, 2]].astype(np.int_)
    Out[9]: Index([1, 2, 3], dtype='int64')
    
  • set_index不再将 MultiIndexes 转换为元组索引。例如,旧行为在本例中返回索引 ( GH 6459 ):

    # Old behavior, casted MultiIndex to an Index
    In [10]: tuple_ind
    Out[10]: Index([('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')], dtype='object')
    
    In [11]: df_multi.set_index(tuple_ind)
    Out[11]: 
                   0         1
    (a, c)  0.471435 -1.190976
    (a, d)  1.432707 -0.312652
    (b, c) -0.720589  0.887163
    (b, d)  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
    # New behavior
    In [12]: mi
    Out[12]: 
    MultiIndex([('a', 'c'),
                ('a', 'd'),
                ('b', 'c'),
                ('b', 'd')],
               )
    
    In [13]: df_multi.set_index(mi)
    Out[13]: 
                0         1
    a c  0.471435 -1.190976
      d  1.432707 -0.312652
    b c -0.720589  0.887163
      d  0.859588 -0.636524
    
    [4 rows x 2 columns]
    

    当将多个索引传递给 时,这也适用set_index

    # Old output, 2-level MultiIndex of tuples
    In [14]: df_multi.set_index([df_multi.index, df_multi.index])
    Out[14]: 
                          0         1
    (a, c) (a, c)  0.471435 -1.190976
    (a, d) (a, d)  1.432707 -0.312652
    (b, c) (b, c) -0.720589  0.887163
    (b, d) (b, d)  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
    # New output, 4-level MultiIndex
    In [15]: df_multi.set_index([df_multi.index, df_multi.index])
    Out[15]: 
                    0         1
    a c a c  0.471435 -1.190976
      d a d  1.432707 -0.312652
    b c b c -0.720589  0.887163
      d b d  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
  • pairwise关键字已添加到统计矩函数 rolling_cov, rolling_corr, ewmcov, ewmcorr, expanding_cov,expanding_corr以允许计算移动窗口协方差和相关矩阵 ( GH 4950 )。请参阅 文档中的计算滚动成对协方差和相关性。

    In [1]: df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
    
    In [4]: covs = pd.rolling_cov(df[['A', 'B', 'C']],
      ....:                       df[['B', 'C', 'D']],
      ....:                       5,
      ....:                       pairwise=True)
    
    
    In [5]: covs[df.index[-1]]
    Out[5]:
              B         C         D
    A  0.035310  0.326593 -0.505430
    B  0.137748 -0.006888 -0.005383
    C -0.006888  0.861040  0.020762
    
  • Series.iteritems()现在是惰性的(返回迭代器而不是列表)。这是 0.14 之前记录的行为。 (GH 6760

  • 添加nuniquevalue_counts函数来Index计算唯一元素。 (GH 6734

  • stack现在,当关键字引用(之前提出了 a )中的非唯一项时,unstack将引发 a 。 (GH 6738ValueErrorlevelIndexKeyError

  • Series.sort从;中删除未使用的顺序参数args 现在的顺序与Series.order;相同添加na_positionarg 以符合Series.order( GH 6847 )

  • 默认排序算法是Series.ordernow quicksort,以符合Series.sort (和 numpy 默认值)

  • 添加inplace关键字使Series.order/sort它们反转(GH 6859

  • DataFrame.sort现在根据参数将 NaN 放置在排序的开头或结尾na_position。 (GH 3917

  • Accept TextFileReaderin concat,它影响了一个常见的用户习惯用法(GH 6583),这是从 0.13.1 开始的回归

  • 添加了获取索引器和唯一值的factorize功能(GH 7090IndexSeries

  • describe在混合了时间戳和字符串对象的 DataFrame 上返回不同的索引(GH 7088)。以前索引是无意排序的。

  • 使用 dtypes 的算术运算bool现在会发出警告,指示它们在 Python 空间中针对+-、 和*运算进行评估,并对所有其他运算进行提升(GH 7011GH 6762GH 7015GH 7210

    >>> x = pd.Series(np.random.rand(10) > 0.5)
    >>> y = True
    >>> x + y  # warning generated: should do x | y instead
    UserWarning: evaluating in Python space because the '+' operator is not
    supported by numexpr for the bool dtype, use '|' instead
    >>> x / y  # this raises because it doesn't make sense
    NotImplementedError: operator '/' not implemented for bool dtypes
    
  • 在 中HDFStore,当找不到键或选择器时,select_as_multiple总是会引发, ( GH 6177 )KeyError

  • df['col'] = value现在完全等价;以前不一定会强制结果系列的 dtype ( GH 6149 )df.loc[:,'col'] = value.loc

  • dtypes现在ftypes返回一系列dtype=object空容器(GH 5740

  • df.to_csv如果既没有提供目标路径也没有提供缓冲区,现在将返回 CSV 数据字符串 ( GH 6061 )

  • pd.infer_freq()TypeError如果给定无效Series/Index 类型(GH 6407GH 6463),现在将引发

  • 传递给的元组DataFame.sort_index将被解释为索引的级别,而不是需要元组列表(GH 4370

  • 所有偏移操作现在返回Timestamp类型(而不是日期时间),业务/周频率不正确(GH 4069

  • to_excel现在转换np.inf为字符串表示形式,可通过inf_rep关键字参数进行自定义(Excel 没有本机 inf 表示形式)(GH 6782

  • 替换pandas.compat.scipy.scoreatpercentilenumpy.percentileGH 6810

  • .quantile系列datetime[ns]现在返回Timestamp而不是np.datetime64对象(GH 6810

  • 更改AssertionErrorTypeError传递给的无效类型concatGH 6583

  • TypeErrorDataFrame传递一个迭代器作为 参数时引发一个dataGH 5357

显示变化#

  • 打印大型 DataFrame 的默认方式已更改。超出max_rows和/或的数据帧现在显示在中央截断视图中,与( GH 5603max_columns )的打印一致 。pandas.Series

    在以前的版本中,一旦达到维度约束,DataFrame 就会被截断,并且椭圆 (…) 表示部分数据被截断。

    以前截断的样子。

    在当前版本中,大型 DataFrame 被集中截断,在两个维度上显示头部和尾部的预览。

    新面貌。
  • 'truncate'允许选择display.show_dimensions仅在框架被截断时显示尺寸(GH 6547)。

    现在的默认display.show_dimensions值为truncate.这与系列显示长度的方式一致。

    In [16]: dfd = pd.DataFrame(np.arange(25).reshape(-1, 5),
       ....:                    index=[0, 1, 2, 3, 4],
       ....:                    columns=[0, 1, 2, 3, 4])
       ....: 
    
    # show dimensions since this is truncated
    In [17]: with pd.option_context('display.max_rows', 2, 'display.max_columns', 2,
       ....:                        'display.show_dimensions', 'truncate'):
       ....:     print(dfd)
       ....: 
         0  ...   4
    0    0  ...   4
    ..  ..  ...  ..
    4   20  ...  24
    
    [5 rows x 5 columns]
    
    # will not show dimensions since it is not truncated
    In [18]: with pd.option_context('display.max_rows', 10, 'display.max_columns', 40,
       ....:                        'display.show_dimensions', 'truncate'):
       ....:     print(dfd)
       ....: 
        0   1   2   3   4
    0   0   1   2   3   4
    1   5   6   7   8   9
    2  10  11  12  13  14
    3  15  16  17  18  19
    4  20  21  22  23  24
    
  • 多索引系列显示中的回归display.max_rows小于系列长度 ( GH 7101 )

  • large_repr修复了截断的 Series 或 DataFrame 的 HTML 表示中不显示设置为“info”的类名的错误 ( GH 7105 )

  • verbose中的关键字现在 默认为DataFrame.info()控制是否缩短表示形式。这将遵循 中的全局设置 。全局设置可以用或 覆盖。infoNonedisplay.max_info_columnsverbose=Trueverbose=False

  • info修复了repr 不遵守设置的错误display.max_info_columns( GH 6939 )

  • 偏移/频率信息现在位于时间戳 __repr__ ( GH 4553 )中

文本解析 API 更改#

read_csv()/read_table()现在对于无效选项来说会更加嘈杂,而不是退回到PythonParser.

GroupBy API 更改#

某些 groupby 方法的行为更加一致:

  • groupbyhead现在tail更像filter是聚合:

    In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B'])
    
    In [2]: g = df.groupby('A')
    
    In [3]: g.head(1)  # filters DataFrame
    Out[3]:
       A  B
    0  1  2
    2  5  6
    
    In [4]: g.apply(lambda x: x.head(1))  # used to simply fall-through
    Out[4]:
         A  B
    A
    1 0  1  2
    5 2  5  6
    
  • groupby 头尾尊重列选择:

    In [19]: g[['B']].head(1)
    Out[19]:
       B
    0  2
    2  6
    
    [2 rows x 1 columns]
    
  • groupbynth现在默认减少;可以通过传递 来实现过滤as_index=False。使用可选dropna参数来忽略 NaN。请参阅文档

    减少

    In [19]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B'])
    
    In [20]: g = df.groupby('A')
    
    In [21]: g.nth(0)
    Out[21]: 
       A    B
    0  1  NaN
    2  5  6.0
    
    [2 rows x 2 columns]
    
    # this is equivalent to g.first()
    In [22]: g.nth(0, dropna='any')
    Out[22]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    
    # this is equivalent to g.last()
    In [23]: g.nth(-1, dropna='any')
    Out[23]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    

    过滤

    In [24]: gf = df.groupby('A', as_index=False)
    
    In [25]: gf.nth(0)
    Out[25]: 
       A    B
    0  1  NaN
    2  5  6.0
    
    [2 rows x 2 columns]
    
    In [26]: gf.nth(0, dropna='any')
    Out[26]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    
  • groupby 现在不会返回非 cython 函数的分组列(GH 5610GH 5614GH 6732),因为它已经是索引

    In [27]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6], [5, 8]], columns=['A', 'B'])
    
    In [28]: g = df.groupby('A')
    
    In [29]: g.count()
    Out[29]: 
       B
    A   
    1  1
    5  2
    
    [2 rows x 1 columns]
    
    In [30]: g.describe()
    Out[30]: 
          B                                        
      count mean       std  min  25%  50%  75%  max
    A                                              
    1   1.0  4.0       NaN  4.0  4.0  4.0  4.0  4.0
    5   2.0  7.0  1.414214  6.0  6.5  7.0  7.5  8.0
    
    [2 rows x 8 columns]
    
  • 传递as_index将使分组列保持原位(这在 0.14.0 中没有改变)

    In [31]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6], [5, 8]], columns=['A', 'B'])
    
    In [32]: g = df.groupby('A', as_index=False)
    
    In [33]: g.count()
    Out[33]: 
       A  B
    0  1  1
    1  5  2
    
    [2 rows x 2 columns]
    
    In [34]: g.describe()
    Out[34]: 
       A     B                                        
         count mean       std  min  25%  50%  75%  max
    0  1   1.0  4.0       NaN  4.0  4.0  4.0  4.0  4.0
    1  5   2.0  7.0  1.414214  6.0  6.5  7.0  7.5  8.0
    
    [2 rows x 9 columns]
    
  • 允许通过 指定更复杂的分组pd.Grouper,例如同时按时间和字符串字段进行分组。请参阅文档。 (GH 3794

  • 执行 groupby 操作时更好地传播/保留系列名称:

    • SeriesGroupBy.agg将确保原始系列的名称属性传播到结果(GH 6265)。

    • 如果提供的函数返回一个命名系列,则该系列的名称将保留为( GH 6124GroupBy.apply )返回的 DataFrame 的列索引的名称。这有助于 将列索引的名称用作包含透视数据的插入列的名称的操作。GroupBy.applyDataFrame.stack

SQL #

SQL 读写功能现在通过 SQLAlchemy 支持更多数据库风格(GH 2717GH 4163GH 5950GH 6292)。 SQLAlchemy 支持的所有数据库都可以使用,例如 PostgreSQL、MySQL、Oracle、Microsoft SQL Server(请参阅 SQLAlchemy 所包含方言的文档)。

未来仅sqlite3支持提供DBAPI连接对象的功能。该'mysql'风味已被弃用。

新功能read_sql_query()read_sql_table() 介绍。该函数read_sql()作为其他两个函数的便捷包装器,并将根据提供的输入(数据库表名称或 sql 查询)委托给特定函数。

在实践中,您必须engine为 sql 函数提供 SQLAlchemy。要与 SQLAlchemy 连接,您可以使用该create_engine()函数从数据库 URI 创建引擎对象。您只需为要连接的每个数据库创建一次引擎。对于内存中的 sqlite 数据库:

In [35]: from sqlalchemy import create_engine

# Create your connection.
In [36]: engine = create_engine('sqlite:///:memory:')

engine然后可以使用它向该数据库写入数据或从该数据库读取数据:

In [37]: df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})

In [38]: df.to_sql(name='db_table', con=engine, index=False)
Out[38]: 3

您可以通过指定表名从数据库读取数据:

In [39]: pd.read_sql_table('db_table', engine)
Out[39]: 
   A  B
0  1  a
1  2  b
2  3  c

[3 rows x 2 columns]

或者通过指定 sql 查询:

In [40]: pd.read_sql_query('SELECT * FROM db_table', engine)
Out[40]: 
   A  B
0  1  a
1  2  b
2  3  c

[3 rows x 2 columns]

sql 函数的其他一些增强功能包括:

  • 支持写入索引。这可以用关键字控制index (默认为 True)。

  • 指定使用 编写索引时要使用的列标签index_label

  • parse_dates 使用关键字 in read_sql_query()and指定要解析为日期时间的字符串列read_sql_table()

警告

一些现有函数或函数别名已被弃用,并将在未来版本中删除。这包括:tqueryuqueryread_frameframe_querywrite_frame

警告

使用 DBAPI 连接对象时对“mysql”风格的支持已被弃用。 SQLAlchemy 引擎 ( GH 6900 )将进一步支持 MySQL 。

使用切片器的多重索引#

在 0.14.0 中,我们添加了一种对 MultiIndexed 对象进行切片的新方法。您可以通过提供多个索引器来对 MultiIndex 进行切片。

您可以提供任何选择器,就像按标签索引一样,请参阅按标签选择,包括切片、标签列表、标签和布尔索引器。

您可以使用选择slice(None)级别的所有内容。您不需要指定所有 更深的级别,它们将隐含为。slice(None)

像往常一样,切片器的两侧都包含在内,因为这是标签索引。

请参阅文档 另请参阅问题(GH 6134GH 4036GH 3057GH 2598GH 5641GH 7106

警告

您应该在说明符中指定所有轴,这意味着索引.loc的索引器。它们是一些不明确的情况,其中传递的索引器可能会被误解为对两个轴进行索引,而不是对行的 MultiIndex 进行索引。

你应该做这个:

  >>> df.loc[(slice('A1', 'A3'), ...), :]  # noqa: E901

rather than this:
>>> df.loc[(slice('A1', 'A3'), ...)]  # noqa: E901

警告

您需要确保选择轴已完全排序!

In [41]: def mklbl(prefix, n):
   ....:     return ["%s%s" % (prefix, i) for i in range(n)]
   ....: 

In [42]: index = pd.MultiIndex.from_product([mklbl('A', 4),
   ....:                                     mklbl('B', 2),
   ....:                                     mklbl('C', 4),
   ....:                                     mklbl('D', 2)])
   ....: 

In [43]: columns = pd.MultiIndex.from_tuples([('a', 'foo'), ('a', 'bar'),
   ....:                                      ('b', 'foo'), ('b', 'bah')],
   ....:                                     names=['lvl0', 'lvl1'])
   ....: 

In [44]: df = pd.DataFrame(np.arange(len(index) * len(columns)).reshape((len(index),
   ....:                   len(columns))),
   ....:                   index=index,
   ....:                   columns=columns).sort_index().sort_index(axis=1)
   ....: 

In [45]: df
Out[45]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0    9    8   11   10
         D1   13   12   15   14
      C2 D0   17   16   19   18
...          ...  ...  ...  ...
A3 B1 C1 D1  237  236  239  238
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  249  248  251  250
         D1  253  252  255  254

[64 rows x 4 columns]

使用切片、列表和标签的基本多索引切片。

In [46]: df.loc[(slice('A1', 'A3'), slice(None), ['C1', 'C3']), :]
Out[46]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A1 B0 C1 D0   73   72   75   74
         D1   77   76   79   78
      C3 D0   89   88   91   90
         D1   93   92   95   94
   B1 C1 D0  105  104  107  106
...          ...  ...  ...  ...
A3 B0 C3 D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

[24 rows x 4 columns]

您可以使用 apd.IndexSlice来快捷创建这些切片

In [47]: idx = pd.IndexSlice

In [48]: df.loc[idx[:, :, ['C1', 'C3']], idx[:, 'foo']]
Out[48]: 
lvl0           a    b
lvl1         foo  foo
A0 B0 C1 D0    8   10
         D1   12   14
      C3 D0   24   26
         D1   28   30
   B1 C1 D0   40   42
...          ...  ...
A3 B0 C3 D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[32 rows x 2 columns]

使用此方法可以同时在多个轴上执行相当复杂的选择。

In [49]: df.loc['A1', (slice(None), 'foo')]
Out[49]: 
lvl0        a    b
lvl1      foo  foo
B0 C0 D0   64   66
      D1   68   70
   C1 D0   72   74
      D1   76   78
   C2 D0   80   82
...       ...  ...
B1 C1 D1  108  110
   C2 D0  112  114
      D1  116  118
   C3 D0  120  122
      D1  124  126

[16 rows x 2 columns]

In [50]: df.loc[idx[:, :, ['C1', 'C3']], idx[:, 'foo']]
Out[50]: 
lvl0           a    b
lvl1         foo  foo
A0 B0 C1 D0    8   10
         D1   12   14
      C3 D0   24   26
         D1   28   30
   B1 C1 D0   40   42
...          ...  ...
A3 B0 C3 D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[32 rows x 2 columns]

使用布尔索引器,您可以提供与相关的选择。

In [51]: mask = df[('a', 'foo')] > 200

In [52]: df.loc[idx[mask, :, ['C1', 'C3']], idx[:, 'foo']]
Out[52]: 
lvl0           a    b
lvl1         foo  foo
A3 B0 C1 D1  204  206
      C3 D0  216  218
         D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[7 rows x 2 columns]

您还可以指定axis参数来.loc解释单个轴上传递的切片器。

In [53]: df.loc(axis=0)[:, :, ['C1', 'C3']]
Out[53]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C1 D0    9    8   11   10
         D1   13   12   15   14
      C3 D0   25   24   27   26
         D1   29   28   31   30
   B1 C1 D0   41   40   43   42
...          ...  ...  ...  ...
A3 B0 C3 D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

[32 rows x 4 columns]

此外,您可以使用这些方法设置

In [54]: df2 = df.copy()

In [55]: df2.loc(axis=0)[:, :, ['C1', 'C3']] = -10

In [56]: df2
Out[56]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0  -10  -10  -10  -10
         D1  -10  -10  -10  -10
      C2 D0   17   16   19   18
...          ...  ...  ...  ...
A3 B1 C1 D1  -10  -10  -10  -10
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  -10  -10  -10  -10
         D1  -10  -10  -10  -10

[64 rows x 4 columns]

您也可以使用可对齐对象的右侧。

In [57]: df2 = df.copy()

In [58]: df2.loc[idx[:, :, ['C1', 'C3']], :] = df2 * 1000

In [59]: df2
Out[59]: 
lvl0              a               b        
lvl1            bar     foo     bah     foo
A0 B0 C0 D0       1       0       3       2
         D1       5       4       7       6
      C1 D0    9000    8000   11000   10000
         D1   13000   12000   15000   14000
      C2 D0      17      16      19      18
...             ...     ...     ...     ...
A3 B1 C1 D1  237000  236000  239000  238000
      C2 D0     241     240     243     242
         D1     245     244     247     246
      C3 D0  249000  248000  251000  250000
         D1  253000  252000  255000  254000

[64 rows x 4 columns]

绘图#

  • DataFrame.plot来自with kind='hexbin'( GH 5478 )的六边形箱图,请参阅文档

  • DataFrame.plot现在Series.plot支持指定面积图kind='area'GH 6656),请参阅文档

  • Series.plot来自和DataFrame.plotkind='pie'GH 6976 )的饼图,请参阅文档

  • 和对象.plot的方法现在支持使用误差线绘图(GH 3796GH 6834),请参阅文档DataFrameSeries

  • DataFrame.plot现在Series.plot支持table用于绘图的关键字matplotlib.Table,请参阅文档。该table关键字可以接收以下值。

    • False:不执行任何操作(默认)。

    • TrueDataFrame:使用orSeries调用的方法绘制表格plot。数据将被转置以满足 matplotlib 的默认布局。

    • DataFrameSeries:使用传递的数据绘制 matplotlib.table。数据将按照打印方法中显示的方式绘制(不会自动转置)。此外,还添加了辅助函数以从和pandas.tools.plotting.table创建表,并将其添加到.DataFrameSeriesmatplotlib.Axes

  • plot(legend='reverse')现在将反转大多数绘图类型的图例标签的顺序。 (GH 6014

  • stacked=True线图和面积图可以通过(GH 6656)堆叠

  • 以下关键字现在可以用于DataFrame.plot()withkind='bar'kind='barh'

    • width:指定条形宽度。在以前的版本中,静态值 0.5 被传递给 matplotlib 并且不能被覆盖。 (GH 6604

    • align:指定条形对齐方式。默认为center(与 matplotlib 不同)。在以前的版本中,pandas 传递align='edge'给 matplotlib 并自行调整位置center,结果align关键字未按预期应用。 (GH 4525

    • position:指定条形图布局的相对对齐方式。从 0(左/底端)到 1(右/顶端)。默认值为 0.5(中心)。 (GH 6604

    由于默认align值发生更改,条形图的坐标现在位于整数值(0.0、1.0、2.0 …)上。这是为了使条形图位于与线图相同的坐标上。但是,当您手动调整条形位置或绘图区域(例如使用set_xlimset_ylim等)时,条形图可能会出现意外变化。在这种情况下,请修改您的脚本以适应新的坐标。

  • parallel_coordinates()函数现在采用参数color 而不是colors。提出AFutureWarning是为了警告旧的colors论点在未来的版本中将不会得到支持。 (GH 6956

  • parallel_coordinates()和函数andrews_curves()现在采用位置参数frame而不是data。如果按名称使用FutureWarning旧参数,则会引发A。dataGH 6956

  • DataFrame.boxplot()现在支持layout关键字(GH 6769

  • DataFrame.boxplot()有一个新的关键字参数return_type.它接受'dict''axes''both',在这种情况下,返回带有 matplotlib 轴的命名元组和 matplotlib Lines 的字典。

先前版本弃用/更改#

先前版本的弃用从 0.14.0 起生效。

弃用#

  • /pivot_table()DataFrame.pivot_table()函数crosstab()现在采用参数indexandcolumns而不是rowsand cols。提出A FutureWarning是为了警告旧版本rowscols参数在未来版本中将不受支持 ( GH 5505 )

  • DataFrame.drop_duplicates()和方法DataFrame.duplicated()现在采用参数,subset而不是为了cols更好地与 保持一致 DataFrame.dropna()。提出AFutureWarning是为了警告旧的 cols参数在未来的版本中将不再受支持 ( GH 6680 )

  • DataFrame.to_csv()and函数DataFrame.to_excel()现在采用参数columns而不是cols。提出A FutureWarning是为了警告旧的cols参数在未来的版本中将不再受支持 ( GH 6645 )

  • FutureWarning与标量索引器和非浮点索引一起使用时,索引器将发出警告( GH 4892GH 6960

    # non-floating point indexes can only be indexed by integers / labels
    In [1]: pd.Series(1, np.arange(5))[3.0]
            pandas/core/index.py:469: FutureWarning: scalar indexers for index type Int64Index should be integers and not floating point
    Out[1]: 1
    
    In [2]: pd.Series(1, np.arange(5)).iloc[3.0]
            pandas/core/index.py:469: FutureWarning: scalar indexers for index type Int64Index should be integers and not floating point
    Out[2]: 1
    
    In [3]: pd.Series(1, np.arange(5)).iloc[3.0:4]
            pandas/core/index.py:527: FutureWarning: slice indexers when using iloc should be integers and not floating point
    Out[3]:
            3    1
            dtype: int64
    
    # these are Float64Indexes, so integer or floating point is acceptable
    In [4]: pd.Series(1, np.arange(5.))[3]
    Out[4]: 1
    
    In [5]: pd.Series(1, np.arange(5.))[3.0]
    Out[6]: 1
    
  • Numpy 1.9 兼容 wrt 弃用警告(GH 6960

  • Panel.shift()现在有一个匹配的函数签名DataFrame.shift()。旧的位置参数lags已更改为 periods默认值为 1 的关键字参数。如果按名称使用FutureWarning旧参数,则会引发A。 lagsGH 6910

  • 关键字order参数factorize()将被删除。 (GH 6926)。

  • copyDataFrame.xs(), Panel.major_xs(),中删除关键字Panel.minor_xs()。如果可能,将返回视图,否则将制作副本。以前,用户可能认为copy=False总会返回一个视图。 (GH 6894

  • parallel_coordinates()函数现在采用参数color 而不是colors。提出AFutureWarning是为了警告旧的colors论点在未来的版本中将不会得到支持。 (GH 6956

  • parallel_coordinates()和函数andrews_curves()现在采用位置参数frame而不是data。如果按名称使用FutureWarning旧参数,则会引发A。dataGH 6956

  • 使用 DBAPI 连接对象时对“mysql”风格的支持已被弃用。 SQLAlchemy 引擎 ( GH 6900 )将进一步支持 MySQL 。

  • 以下io.sql函数已被弃用:tquery, uquery, read_frame, frame_query, write_frame

  • 关键字percentile_width参数 indescribe()已被弃用。请percentiles改用关键字,它需要显示百分位数列表。默认输出不变。

  • 在未来版本中,默认返回类型boxplot()将从 dict 更改为 matplotlib Axes。您现在可以通过传递给箱线图来使用未来的行为return_type='axes'

已知的问题

  • OpenPyXL 2.0.0 破坏了向后兼容性(GH 7169

增强功能#

  • 如果传递元组字典,DataFrame 和 Series 将创建一个 MultiIndex 对象,请参阅文档GH 3323

    In [60]: pd.Series({('a', 'b'): 1, ('a', 'a'): 0,
       ....:            ('a', 'c'): 2, ('b', 'a'): 3, ('b', 'b'): 4})
       ....: 
    Out[60]: 
    a  b    1
       a    0
       c    2
    b  a    3
       b    4
    Length: 5, dtype: int64
    
    In [61]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
       ....:              ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
       ....:              ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
       ....:              ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
       ....:              ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
       ....: 
    Out[61]: 
           a              b      
           b    a    c    a     b
    A B  1.0  4.0  5.0  8.0  10.0
      C  2.0  3.0  6.0  7.0   NaN
      D  NaN  NaN  NaN  NaN   9.0
    
    [3 rows x 5 columns]
    
  • 将该sym_diff方法添加到IndexGH 5543

  • DataFrame.to_latex现在采用 longtable 关键字,如果 True 将返回 longtable 环境中的表。 (GH 6617

  • 添加选项以关闭转义DataFrame.to_latexGH 6472

  • pd.read_clipboard如果未指定关键字sep,将尝试检测从电子表格复制的数据并进行相应的解析。 (GH 6223

  • 将单索引 DataFrame 与多索引 DataFrame 连接(GH 3662

    请参阅文档。 ATM 尚不支持在左侧和右侧加入 MultiIndex DataFrame。

    In [62]: household = pd.DataFrame({'household_id': [1, 2, 3],
       ....:                           'male': [0, 1, 0],
       ....:                           'wealth': [196087.3, 316478.7, 294750]
       ....:                           },
       ....:                          columns=['household_id', 'male', 'wealth']
       ....:                          ).set_index('household_id')
       ....: 
    
    In [63]: household
    Out[63]: 
                  male    wealth
    household_id                
    1                0  196087.3
    2                1  316478.7
    3                0  294750.0
    
    [3 rows x 2 columns]
    
    In [64]: portfolio = pd.DataFrame({'household_id': [1, 2, 2, 3, 3, 3, 4],
       ....:                           'asset_id': ["nl0000301109",
       ....:                                        "nl0000289783",
       ....:                                        "gb00b03mlx29",
       ....:                                        "gb00b03mlx29",
       ....:                                        "lu0197800237",
       ....:                                        "nl0000289965",
       ....:                                        np.nan],
       ....:                           'name': ["ABN Amro",
       ....:                                    "Robeco",
       ....:                                    "Royal Dutch Shell",
       ....:                                    "Royal Dutch Shell",
       ....:                                    "AAB Eastern Europe Equity Fund",
       ....:                                    "Postbank BioTech Fonds",
       ....:                                    np.nan],
       ....:                           'share': [1.0, 0.4, 0.6, 0.15, 0.6, 0.25, 1.0]
       ....:                           },
       ....:                          columns=['household_id', 'asset_id', 'name', 'share']
       ....:                          ).set_index(['household_id', 'asset_id'])
       ....: 
    
    In [65]: portfolio
    Out[65]: 
                                                         name  share
    household_id asset_id                                           
    1            nl0000301109                        ABN Amro   1.00
    2            nl0000289783                          Robeco   0.40
                 gb00b03mlx29               Royal Dutch Shell   0.60
    3            gb00b03mlx29               Royal Dutch Shell   0.15
                 lu0197800237  AAB Eastern Europe Equity Fund   0.60
                 nl0000289965          Postbank BioTech Fonds   0.25
    4            NaN                                      NaN   1.00
    
    [7 rows x 2 columns]
    
    In [66]: household.join(portfolio, how='inner')
    Out[66]: 
                               male  ...  share
    household_id asset_id            ...       
    1            nl0000301109     0  ...   1.00
    2            nl0000289783     1  ...   0.40
                 gb00b03mlx29     1  ...   0.60
    3            gb00b03mlx29     0  ...   0.15
                 lu0197800237     0  ...   0.60
                 nl0000289965     0  ...   0.25
    
    [6 rows x 4 columns]
    
  • quotechardoublequoteescapechar现在可以在使用时指定DataFrame.to_csv( GH 5414GH 4528 )

  • 使用布尔 kwarg 仅按 MultiIndex 的指定级别进行部分排序 sort_remaining。 (GH 3984

  • 添加to_julian_dateTimeStampDatetimeIndex。儒略历主要用于天文学,表示从公元前 4713 年 1 月 1 日中午算起的天数。由于 pandas 使用纳秒来定义时间,因此您可以使用的实际日期范围是公元 1678 年到公元 2262 年。 (GH 4041

  • DataFrame.to_stata现在将检查数据与 Stata 数据类型的兼容性,并在需要时向上转换。当无法无损向上转换时,会发出警告(GH 6327

  • DataFrame.to_stata并将StataWriter接受关键字参数 time_stamp 和 data_label ,它们允许在创建文件时设置时间戳和数据集标签。 (GH 6545

  • pandas.io.gbq现在可以正确处理读取 unicode 字符串。 (GH 5940

  • 假期日历现已推出,可与CustomBusinessDay偏移量一起使用 ( GH 6719 )

  • Float64Indexfloat64现在由dtype ndarray 而不是 objectdtype 数组 ( GH 6471 )支持。

  • 已实施Panel.pct_changeGH 6904

  • how向滚动力矩函数添加了选项,以指示如何处理重采样;rolling_max()默认为 max, rolling_min()默认为 min,所有其他默认为平均值 ( GH 6297 )

  • CustomBusinessMonthBegin现已CustomBusinessMonthEnd上市(GH 6866

  • Series.quantile()现在DataFrame.quantile()接受一组分位数。

  • describe()现在接受一系列百分位数以包含在摘要统计中(GH 4196

  • pivot_table现在可以接受Grouperbyindexcolumns关键字 ( GH 6913 )

    In [67]: import datetime
    
    In [68]: df = pd.DataFrame({
       ....:     'Branch': 'A A A A A B'.split(),
       ....:     'Buyer': 'Carl Mark Carl Carl Joe Joe'.split(),
       ....:     'Quantity': [1, 3, 5, 1, 8, 1],
       ....:     'Date': [datetime.datetime(2013, 11, 1, 13, 0),
       ....:              datetime.datetime(2013, 9, 1, 13, 5),
       ....:              datetime.datetime(2013, 10, 1, 20, 0),
       ....:              datetime.datetime(2013, 10, 2, 10, 0),
       ....:              datetime.datetime(2013, 11, 1, 20, 0),
       ....:              datetime.datetime(2013, 10, 2, 10, 0)],
       ....:     'PayDay': [datetime.datetime(2013, 10, 4, 0, 0),
       ....:                datetime.datetime(2013, 10, 15, 13, 5),
       ....:                datetime.datetime(2013, 9, 5, 20, 0),
       ....:                datetime.datetime(2013, 11, 2, 10, 0),
       ....:                datetime.datetime(2013, 10, 7, 20, 0),
       ....:                datetime.datetime(2013, 9, 5, 10, 0)]})
       ....: 
    
    In [69]: df
    Out[69]: 
      Branch Buyer  Quantity                Date              PayDay
    0      A  Carl         1 2013-11-01 13:00:00 2013-10-04 00:00:00
    1      A  Mark         3 2013-09-01 13:05:00 2013-10-15 13:05:00
    2      A  Carl         5 2013-10-01 20:00:00 2013-09-05 20:00:00
    3      A  Carl         1 2013-10-02 10:00:00 2013-11-02 10:00:00
    4      A   Joe         8 2013-11-01 20:00:00 2013-10-07 20:00:00
    5      B   Joe         1 2013-10-02 10:00:00 2013-09-05 10:00:00
    
    [6 rows x 5 columns]
    
    In [75]: df.pivot_table(values='Quantity',
       ....:                index=pd.Grouper(freq='M', key='Date'),
       ....:                columns=pd.Grouper(freq='M', key='PayDay'),
       ....:                aggfunc="sum")
    Out[75]:
    PayDay      2013-09-30  2013-10-31  2013-11-30
    Date
    2013-09-30         NaN         3.0         NaN
    2013-10-31         6.0         NaN         1.0
    2013-11-30         NaN         9.0         NaN
    
    [3 rows x 3 columns]
    
  • 字符串数组可以包装到指定的宽度 ( str.wrap) ( GH 6999 )

  • 添加nsmallest()方法Series.nlargest()到系列,请参阅文档GH 3960

  • PeriodIndex完全支持部分字符串索引,例如DatetimeIndexGH 7043

    In [76]: prng = pd.period_range('2013-01-01 09:00', periods=100, freq='H')
    
    In [77]: ps = pd.Series(np.random.randn(len(prng)), index=prng)
    
    In [78]: ps
    Out[78]:
    2013-01-01 09:00    0.015696
    2013-01-01 10:00   -2.242685
    2013-01-01 11:00    1.150036
    2013-01-01 12:00    0.991946
    2013-01-01 13:00    0.953324
                          ...
    2013-01-05 08:00    0.285296
    2013-01-05 09:00    0.484288
    2013-01-05 10:00    1.363482
    2013-01-05 11:00   -0.781105
    2013-01-05 12:00   -0.468018
    Freq: H, Length: 100, dtype: float64
    
    In [79]: ps['2013-01-02']
    Out[79]:
    2013-01-02 00:00    0.553439
    2013-01-02 01:00    1.318152
    2013-01-02 02:00   -0.469305
    2013-01-02 03:00    0.675554
    2013-01-02 04:00   -1.817027
                          ...
    2013-01-02 19:00    0.036142
    2013-01-02 20:00   -2.074978
    2013-01-02 21:00    0.247792
    2013-01-02 22:00   -0.897157
    2013-01-02 23:00   -0.136795
    Freq: H, Length: 24, dtype: float64
    
  • read_excel现在可以使用 xlrd >= 0.9.3 读取 Excel 日期和时间中的毫秒数。 (GH 5945

  • pd.stats.moments.rolling_var现在使用 Welford 方法来提高数值稳定性(GH 6817

  • pd.expanding_apply 和 pd.rolling_apply 现在采用传递给 func 的 args 和 kwargs ( GH 6289 )

  • DataFrame.rank()现在有百分比排名选项(GH 5971

  • Series.rank()现在有百分比排名选项(GH 5971

  • Series.rank()现在DataFrame.rank()接受method='dense'无间隙的排名(GH 6514

  • 支持使用encodingxlwt传递(GH 3710

  • 重构块类,删除Block.items属性以避免项目处理中的重复(GH 6745GH 6988)。

  • 更新测试语句以使用专用断言(GH 6175

表现

  • 使用(GH 6636)转换DatetimeIndex为浮动序数时的性能改进DatetimeConverter

  • DataFrame.shift( GH 5609 )的性能改进

  • 多索引系列索引的性能改进 ( GH 5567 )

  • 单数据类型索引的性能改进 ( GH 6484 )

  • 通过删除错误的缓存(例如 MonthEnd、BusinessMonthEnd),提高具有某些偏移量的 DataFrame 构造的性能,(GH 6479

  • CustomBusinessDay提高( GH 6584 )的性能

  • 使用字符串键提高系列上切片索引的性能(GH 6341GH 6372

  • DataFrame.from_records从可迭代对象读取指定数量的行时的性能改进( GH 6700

  • 整数数据类型的 timedelta 转换的性能改进 ( GH 6754 )

  • 改进了兼容泡菜的性能 ( GH 6899 )

  • 通过优化提高某些重新索引操作的性能take_2dGH 6749

  • GroupBy.count()现在在 Cython 中实现,对于大量组来说速度要快得多 ( GH 7016 )。

实验#

0.14.0 中没有实验性更改

Bug修复

  • 当索引与数据不匹配时,Series ValueError 中出现错误(GH 6532

  • 防止由于 HDFStore 表格式不支持 MultiIndex 而出现段错误(GH 1848

  • pd.DataFrame.sort_index合并排序不稳定的错误ascending=FalseGH 6399

  • pd.tseries.frequencies.to_offset当参数有前导零时出现错误( GH 6391

  • 版本字符串生成中的错误。对于具有浅克隆的开发版本/从 tarball 安装(GH 6127

  • 当年的Timestamptz解析不一致( GH 5958to_datetime

  • 重新排序索引的索引错误(GH 6252GH 6254

  • .xs系列多重索引(GH 6258GH 5684)中的错误

  • 将字符串类型转换为具有指定频率的 DatetimeIndex 时出现错误(GH 6273GH 6274

  • eval大型表达式的类型提升失败的错误( GH 6205 )

  • 插值错误inplace=TrueGH 6281

  • HDFStore.remove现在处理启动和停止(GH 6177

  • HDFStore.select_as_multiple处理启动和停止的方式与selectGH 6177)相同

  • HDFStore.select_as_coordinatesselect_column使用where导致过滤器的子句(GH 6177

  • non_unique_indexes 连接中的回归(GH 6329

  • agg具有单一函数和混合类型框架的groupby 问题( GH 6337

  • DataFrame.replace()传递非参数时出现错误bool to_replaceGH 6332

  • 尝试在多索引分配的不同级别上对齐时引发(GH 3738

  • 通过布尔索引设置复杂数据类型的错误(GH 6345

  • 当出现非单调 DatetimeIndex 时,TimeGrouper/resample 中的错误会返回无效结果。 (GH 4161

  • TimeGrouper/resample 中索引名称传播的错误(GH 4161

  • TimeGrouper 有一个与其余石斑鱼更兼容的 API(例如groups丢失)(GH 3881

  • 根据目标列顺序使用 TimeGrouper 进行多个分组中的错误(GH 6764

  • pd.eval解析带有可能标记的字符串时出现错误,例如'&'GH 6351

  • -inf除以整数 0 时正确处理面板中的放置错误( GH 6178 )

  • DataFrame.shiftaxis=1正在提高(GH 6371

  • 禁用剪贴板测试,直到发布时间(使用本地运行)(GH 6048)。nosetests -A disabled

  • 传递包含不在要替换的值中的键的DataFrame.replace()嵌套时出现错误( GH 6342dict

  • str.match忽略 na 标志(GH 6609)。

  • 未合并的重复列的错误(GH 6240

  • 插值更改数据类型中的错误(GH 6290

  • 错误Series.get,正在使用有错误的访问方法(GH 6383

  • 表单 hdfstore 查询中的错误( GH 6313 )where=[('date', '>=', datetime(2013,1,1)), ('date', '<=', datetime(2014,1,1))]

  • DataFrame.dropna重复索引的错误( GH 6355

  • 从 0.12 ( GH 6394 )开始使用嵌入式列表进行链式 getitem 索引的回归

  • Float64Index与 nans 没有正确比较(GH 6401

  • eval/query带有包含该字符的字符串的表达式@现在可以工作(GH 6366)。

  • Series.reindex指定具有某些 nan 值的 a 时出现的错误method不一致(在重新采样中注明)(GH 6418

  • DataFrame.replace()嵌套字典错误地取决于字典键和值的顺序的错误( GH 5338)。

  • 连接空对象时的性能问题(GH 3259

  • 澄清具有值的对象sym_diff的排序(GH 6444IndexNaN

  • MultiIndex.from_product以输入DatetimeIndex作为回归(GH 6439

  • str.extract传递非默认索引时出现错误( GH 6348

  • str.split通过时出现错误pat=None并且n=1GH 6466

  • io.data.DataReader通过时出现错误"F-F_Momentum_Factor"并且data_source="famafrench"GH 6460

  • sum系列错误timedelta64[ns]( GH 6462 )

  • resample时区和某些偏移量的错误( GH 6397

  • iat/iloc系列上存在重复索引的错误( GH 6493

  • 错误地read_html使用 nan 来指示文本中的缺失值。应使用空字符串以与 pandas 的其余部分保持一致(GH 5129)。

  • 测试中的错误read_html,重定向的无效 URL 会导致一项测试失败 ( GH 6445 )。

  • .loc使用非唯一索引的多轴索引中的错误( GH 6504

  • 当跨 DataFrame 的列轴进行切片索引时导致 _ref_locs 损坏的错误 ( GH 6525 )

  • 系列创建中处理 numpydatetime64非 ns 数据类型时从 0.13 回归 ( GH 6529 )

  • .namesset_index现在保留了传递到的 MultiIndexes 的属性( GH 6459)。

  • setitem 中的错误具有重复的索引和可对齐的 rhs ( GH 6541 )

  • setitem 中.loc混合整数索引的错误 ( GH 6546 )

  • 错误pd.read_stata会使用错误的数据类型和缺失值(GH 6327

  • 在某些情况下,该错误DataFrame.to_stata会导致数据丢失,并且可能会使用错误的数据类型和缺失值导出(GH 6335

  • StataWriter用空字符串替换字符串列中的缺失值 ( GH 6802 )

  • Timestamp加法/减法中的类型不一致( GH 6543 )

  • 在时间戳加法/减法中保留频率的错误(GH 4547

  • 空列表查找中的错误导致IndexError异常(GH 6536GH 6551

  • Series.quantile在 dtype上提高objectGH 6555

  • 掉落时会出现水平.xs错误( GH 6574nan

  • fillnamethod='bfill/ffill'datetime64[ns]dtype 中的错误(GH 6587

  • 使用混合数据类型编写 SQL 时的错误可能会导致数据丢失(GH 6509

  • 错误Series.pop( GH 6600 )

  • iloc当位置索引器Int64Index与相应轴匹配且未发生重新排序时,索引中存在错误( GH 6612

  • 错误fillna与指定limitvalue

  • DataFrame.to_stata当列具有非字符串名称时出现错误( GH 4558

  • 与 兼容的错误np.compress,出现在 ( GH 6658 )

  • 系列的右轴未对齐的二进制运算中的错误(GH 6681

  • DataFrame.to_stata错误处理 nan 值并忽略with_index关键字参数的错误( GH 6685 )

  • 使用均匀可分频率时,使用额外的 bin 重新采样时出现错误 ( GH 4076 )

  • 传递自定义函数时 groupby 聚合的一致性错误 ( GH 6715 )

  • how=None当重采样频率与轴频率相同时重采样中的错误( GH 5955

  • 使用空数组进行向下转型推理时出现错误 ( GH 6733 )

  • 稀疏容器中的错误obj.blocks会删除 dtype 中除最后一项之外的所有相同项(GH 6748

  • 解酸中的错误(GH 4606NaT (NaTType)

  • 即使在(GH 6777DataFrame.replace()时,正则表达式元字符也被视为正则表达式的错误。regex=False

  • 32 位平台上 timedelta 操作中的错误 ( GH 6808 )

  • .index直接通过(GH 6785)设置 tz 感知索引时出现错误

  • Expressions.py 中的错误,其中 numexpr 会尝试计算算术运算(GH 6762)。

  • Makefile 中的错误,它没有删除 Cython 生成的 C 文件(GH 6768make clean

  • HDFStore( GH 6166 )读取长字符串时,numpy < 1.7.2 出现错误

  • DataFrame._reduce将非类布尔 (0/1) 整数转换为布尔值的错误。 (GH 6806

  • 从 0.13 回归,fillna并有一个类似日期时间的系列(GH 6344

  • 添加时区的错误np.timedelta64输出DatetimeIndex不正确的结果(GH 6818

  • DataFrame.replace()通过替换更改数据类型只会替换第一次出现的值的错误( GH 6689

  • 在构造中传递“MS”频率时更好的错误消息Period(GH5332)

  • Series.__unicode__max_rows=None系列超过 1000 行时出现错误。 (GH 6863

  • 错误在于groupby.get_group日期类并不总是被接受(GH 5267

  • groupBy.get_groupTimeGrouperraise创建的错误AttributeError( GH 6914 )

  • 错误插入DatetimeIndex.tz_localizeDatetimeIndex.tz_convert转换NaTGH 5546

  • 影响算术运算的错误NaTGH 6873

  • Series.str.extract单个小组比赛的结果Series未重命名为小组名称的错误

  • DataFrame.to_csv设置index=False忽略 kwarg 的错误headerGH 6186

  • DataFrame.plot和中的错误Series.plot,重复绘制到相同轴时图例的行为不一致(GH 6678

  • 合并中的修补/错误的内部测试__finalize__未最终确定(GH 6923GH 6927

  • Accept TextFileReaderin concat,这影响了常见用户习惯用法(GH 6583

  • C 解析器中存在前导空格的错误 ( GH 3374 )

  • C 解析器中使用delim_whitespace=True\r分隔行的错误

  • python 解析器中的错误,在列标题后面的行中具有显式 MultiIndex(GH 6893

  • 错误Series.rank导致DataFrame.rank小浮动 (<1e-13) 全部获得相同的排名 ( GH 6886 )

  • 使用or并返回空结果DataFrame.apply的函数出现错误( GH 6952*args**kwargs

  • 32 位平台上的总和/平均值溢出错误 ( GH 6915 )

  • 移动并Panel.shift修复NDFrame.slice_shift以尊重多种数据类型。 (GH 6959

  • 启用时的错误subplots=TrueDataFrame.plot具有单列引发TypeErrorSeries.plot引发AttributeErrorGH 6951

  • DataFrame.plot启用subplots和时绘制不必要的轴的错误kind=scatterGH 6951

  • read_csv来自非 utf-8 编码的文件系统的错误( GH 6807 )

  • iloc设置/对齐时出现错误( GH 6766

  • 当使用 unicode 值和前缀调用 get_dummies 时导致 UnicodeEncodeError 的错误(GH 6885

  • 时间序列与频率图光标显示中的错误(GH 5453

  • groupby.plot使用Float64IndexGH 7025)时出现错误

  • 如果无法从雅虎下载选项数据,则停止测试失败(GH 7034

  • parallel_coordinates类列radviz重新排序导致可能的颜色/类不匹配的错误(GH 6956

  • 多个“颜色”值被传递给绘图方法的radviz错误(GH 6956andrews_curves

  • Float64Index.isin()包含 s 的位置中的错误nan会使索引声称它们包含所有内容(GH 7066)。

  • DataFrame.boxplot无法使用作为参数传递的轴的错误axGH 3578

  • XlsxWriter和实现中的错误XlwtWriter导致日期时间列被格式化而没有时间(GH 7075)被传递给绘图方法

  • read_fwf()None就像colspec普通的Python片一样对待。现在,当colspec包含 a None(之前引发了 a TypeError)时,它从行首或直到行尾读取

  • 链式索引和切片的缓存一致性存在错误;添加_is_view属性以NDFrame正确预测视图;仅当其实际副本(而不是视图)时才is_copy标记(GH 7084xs

  • 从字符串 ndarray 创建 DatetimeIndex 时出现错误dayfirst=TrueGH 5917

  • MultiIndex.from_arrays创建自的错误DatetimeIndex不保留freq并且tzGH 7090

  • 包含时unstack引发错误(GH 4342ValueErrorMultiIndexPeriodIndex

  • 错误boxplothist绘制不必要的轴(GH 6769

  • groupby.nth()越界索引器的回归( GH 6621

  • quantile日期时间值错误( GH 6965

  • 错误Dataframe.set_indexreindex并且pivot不保留DatetimeIndexPeriodIndex属性(GH 3950GH 5878GH 6631

  • 错误MultiIndex.get_level_values不保留DatetimeIndexPeriodIndex属性(GH 7092

  • 错误Groupby不会保留tzGH 3950

  • PeriodIndex部分字符串切片中的错误( GH 6716

  • 截断的 Series 或 DataFrame 的 HTML 表示中的错误不显示设置large_repr为“info”的类名(GH 7105

  • 当传递的值太短时DatetimeIndex指定freq引发的错误( GH 7098ValueError

  • info修复了repr 不遵守设置的错误display.max_info_columns( GH 6939 )

  • 错误PeriodIndex字符串切片具有越界值(GH 5407

  • 修复了调整大表大小时散列表实现/因子分解器中的内存错误 ( GH 7157 )

  • isnull应用于 0 维对象数组时出现错误( GH 7176 )

  • queryeval正确查找全局常量的错误( GH 7178

  • iloc使用多轴元组索引器识别越界位置列表索引器时出现错误( GH 7189

  • 具有单个值、MultiIndex 和整数索引的 setitem 中的错误(GH 7190GH 7218

  • 使用反向操作的表达式求值中的错误,显示在系列数据帧操作中(GH 7198GH 7192

  • 使用 > 2 ndim 和 MultiIndex ( GH 7199 )的多轴索引中的错误

  • 修复无效的评估/查询操作会破坏堆栈的错误(GH 5198

贡献者#

共有 94 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。

  • 棘螈+

  • 亚当·马库斯 +

  • 亚历克斯·高迪奥

  • 亚历克斯·罗斯伯格

  • 艾伦唐尼 +

  • 安德鲁·罗森菲尔德 +

  • 安迪·海登

  • 安托万·马齐埃 +

  • 本尼迪克特·绍尔

  • 布拉德·布兰

  • 克里斯托弗·惠兰

  • 克拉克·菲茨杰拉德

  • 帝斯曼

  • 戴尔·荣格

  • 丹·艾伦

  • 丹·伯肯

  • 丹尼尔·韦伯

  • 大卫·荣格 +

  • 大卫·斯蒂芬斯 +

  • 道格拉斯·麦克尼尔

  • 加勒特·德拉帕拉

  • 古塔曼·巴拉拉曼 +

  • 纪尧姆·普兰 +

  • 雅各布·霍华德 +

  • 雅各布·谢尔

  • 贾森·塞克绍尔 +

  • 杰夫·雷巴克

  • 杰夫·特拉特纳

  • 杰弗里·斯塔尔 +

  • 约翰·大卫·里弗 +

  • 约翰·麦克纳马拉

  • 约翰·W·奥布莱恩

  • 乔纳森·钱伯斯

  • 乔里斯·范登博什

  • 朱莉娅·埃文斯

  • 胡里奥+

  • K.-迈克尔·埃伊

  • 凯蒂·阿特金森 +

  • 凯尔西·乔达尔

  • 凯文·谢泼德 +

  • 马特·魏特曼 +

  • 马蒂亚斯·库恩 +

  • 马克斯·格伦德·琼斯 +

  • 迈克尔·E·格鲁恩 +

  • 迈克·凯利

  • 尼蓬·巴特拉 +

  • 诺亚间谍 +

  • PKEuS

  • 帕特里克·奥基夫

  • 菲利普·克劳德

  • 彼得罗·巴蒂斯顿 +

  • 兰迪·卡内瓦莱 +

  • 罗伯特·吉博尼 +

  • 船长西博尔德

  • 泼水舞+

  • 斯蒂芬·霍耶 +

  • 蒂姆·塞拉 +

  • 托比亚斯·勃兰特

  • 托德·詹宁斯 +

  • 汤姆·奥格斯普格

  • 汤姆·奥格斯普格

  • 雅罗斯拉夫·哈尔琴科

  • 阿吉斯伯特 +

  • 阿基特里奇

  • 安科斯蒂斯+

  • 阿诺姆拉克

  • 安东-d+

  • 巴斯蒂奇+

  • 本杰明+

  • 布维格纳尔

  • 古尔克 +

  • chebee7i +

  • 克拉姆+

  • 丹尼尔巴兰

  • 清水77 +

  • 雨果+

  • 沉浸式

  • 伊施瓦巴赫 +

  • 杰梅弗里奥 +

  • 杰雷巴克

  • 杰克斯奥尔 +

  • k二醚+

  • 迈克尔斯+

  • 迈克贝利 +

  • 奥伊多 +

  • 个和零 +

  • 菲布兹+

  • 核糖 +

  • 罗格

  • 辛赫克斯+

  • 乌努特布

  • 韦斯特纳

  • yp

  • 扎克·鲍尔斯