版本 0.20.1(2017 年 5 月 5 日)#

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

亮点包括:

  • Series/DataFrame 的新.agg()API 类似于 groupby-rolling-resample API,请参见此处

  • 与 的集成feather-format,包括新的顶层pd.read_feather()DataFrame.to_feather()方法,请参见此处

  • 索引.ix器已被弃用,请参阅此处

  • Panel已被弃用,请参阅此处

  • 添加IntervalIndexandInterval标量类型,请参见此处

  • 改进了按索引级别分组时的用户 API .groupby(),请参阅此处

  • 改进了对数据类型的支持UInt64,请参见此处

  • JSON 序列化的新方向orient='table',它使用表架构规范,并提供了在 Jupyter Notebook 中进行更具交互性的重现的可能性,请参见此处

  • 对将样式化 DataFrame () 导出到 Excel 的实验性支持DataFrame.style,请参阅此处

  • 窗口二进制 corr/cov 操作现在返回 MultiIndexedDataFrame而不是PanelPanel现在已弃用,请参阅此处

  • 现在使用对 S3 处理的支持s3fs,请参阅此处

  • Google BigQuery 支持现在使用该pandas-gbq库,请参阅此处

警告

pandas 改变了代码库的内部结构和布局。这可能会影响不是来自顶级命名空间的导入,请参阅此处的pandas.*更改。

更新前请检查API 更改弃用。

笔记

这是 0.20.0 和 0.20.1 的组合版本。版本 0.20.1 包含一项额外的更改,以实现与使用 pandas 例程的下游项目的向后兼容性utils。 (GH 16250

新功能

aggDataFrame/Series 的方法API #

Series 和 DataFrame 已得到增强,可支持聚合 API。这是 groupby、窗口操作和重采样中熟悉的 API。这允许使用agg()and以简洁的方式进行聚合操作transform()。完整的文档在这里GH 1623)。

这是一个示例

In [1]: df = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'],
   ...:                   index=pd.date_range('1/1/2000', periods=10))
   ...: 

In [2]: df.iloc[3:7] = np.nan

In [3]: df
Out[3]: 
                   A         B         C
2000-01-01  0.469112 -0.282863 -1.509059
2000-01-02 -1.135632  1.212112 -0.173215
2000-01-03  0.119209 -1.044236 -0.861849
2000-01-04       NaN       NaN       NaN
2000-01-05       NaN       NaN       NaN
2000-01-06       NaN       NaN       NaN
2000-01-07       NaN       NaN       NaN
2000-01-08  0.113648 -1.478427  0.524988
2000-01-09  0.404705  0.577046 -1.715002
2000-01-10 -1.039268 -0.370647 -1.157892

[10 rows x 3 columns]

可以使用字符串函数名称、可调用函数、列表或这些函数的字典进行操作。

使用单个函数相当于.apply.

In [4]: df.agg('sum')
Out[4]: 
A   -1.068226
B   -1.387015
C   -4.892029
Length: 3, dtype: float64

具有函数列表的多个聚合。

In [5]: df.agg(['sum', 'min'])
Out[5]: 
            A         B         C
sum -1.068226 -1.387015 -4.892029
min -1.135632 -1.478427 -1.715002

[2 rows x 3 columns]

使用字典提供了对每列应用特定聚合的能力。您将获得所有聚合器的类似矩阵的输出。每个唯一函数的输出有一列。应用于特定列的这些函数将是NaN

In [6]: df.agg({'A': ['sum', 'min'], 'B': ['min', 'max']})
Out[6]: 
            A         B
sum -1.068226       NaN
min -1.135632 -1.478427
max       NaN  1.212112

[3 rows x 2 columns]

该API还支持.transform()广播结果的功能。

In [7]: df.transform(['abs', lambda x: x - x.min()])
Out[7]: 
                   A                   B                   C          
                 abs  <lambda>       abs  <lambda>       abs  <lambda>
2000-01-01  0.469112  1.604745  0.282863  1.195563  1.509059  0.205944
2000-01-02  1.135632  0.000000  1.212112  2.690539  0.173215  1.541787
2000-01-03  0.119209  1.254841  1.044236  0.434191  0.861849  0.853153
2000-01-04       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-05       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-06       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-07       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-08  0.113648  1.249281  1.478427  0.000000  0.524988  2.239990
2000-01-09  0.404705  1.540338  0.577046  2.055473  1.715002  0.000000
2000-01-10  1.039268  0.096364  0.370647  1.107780  1.157892  0.557110

[10 rows x 6 columns]

当出现无法聚合的混合数据类型时,.agg()将仅采用有效的聚合。这与 groupby 的工作原理类似.agg()。 (GH 15015

In [8]: df = pd.DataFrame({'A': [1, 2, 3],
   ...:                    'B': [1., 2., 3.],
   ...:                    'C': ['foo', 'bar', 'baz'],
   ...:                    'D': pd.date_range('20130101', periods=3)})
   ...: 

In [9]: df.dtypes
Out[9]: 
A             int64
B           float64
C            object
D    datetime64[ns]
Length: 4, dtype: object
In [10]: df.agg(['min', 'sum'])
Out[10]:
     A    B          C          D
min  1  1.0        bar 2013-01-01
sum  6  6.0  foobarbaz        NaT

dtype数据 IO #的关键字参数

'python'的引擎以及read_csv()用于read_fwf()解析固定宽度文本文件和read_excel()解析 Excel 文件的函数现在接受dtype用于指定特定列类型的关键字参数 ( GH 14295 )。请参阅io 文档以获取更多信息。

In [10]: data = "a  b\n1  2\n3  4"

In [11]: pd.read_fwf(StringIO(data)).dtypes
Out[11]: 
a    int64
b    int64
Length: 2, dtype: object

In [12]: pd.read_fwf(StringIO(data), dtype={'a': 'float64', 'b': 'object'}).dtypes
Out[12]: 
a    float64
b     object
Length: 2, dtype: object

方法.to_datetime()获得了一个origin参数#

to_datetime()获得了一个新参数 ,origin用于定义在解析具有特定指定的数值时计算结果时间戳的参考日期unit。 (GH 11276GH 11745

例如,以 1960-01-01 作为开始日期:

In [13]: pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))
Out[13]: DatetimeIndex(['1960-01-02', '1960-01-03', '1960-01-04'], dtype='datetime64[ns]', freq=None)

默认设置为origin='unix',默认为,通常称为“unix 纪元”或 POSIX 时间。这是以前的默认值,因此这是向后兼容的更改。1970-01-01 00:00:00

In [14]: pd.to_datetime([1, 2, 3], unit='D')
Out[14]: DatetimeIndex(['1970-01-02', '1970-01-03', '1970-01-04'], dtype='datetime64[ns]', freq=None)

分组依据增强功能#

DataFrame.groupby()作为参数传递的字符串by现在可以引用列名称或索引级别名称。以前,只能引用列名称。这允许同时轻松地按列和索引级别进行分组。 (GH 5677

In [15]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
   ....:           ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
   ....: 

In [16]: index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])

In [17]: df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3],
   ....:                    'B': np.arange(8)},
   ....:                   index=index)
   ....: 

In [18]: df
Out[18]: 
              A  B
first second      
bar   one     1  0
      two     1  1
baz   one     1  2
      two     1  3
foo   one     2  4
      two     2  5
qux   one     3  6
      two     3  7

[8 rows x 2 columns]

In [19]: df.groupby(['second', 'A']).sum()
Out[19]: 
          B
second A   
one    1  2
       2  4
       3  6
two    1  4
       2  5
       3  7

[6 rows x 1 columns]

更好地支持read_csv#中的压缩 URL

压缩代码被重构(GH 12688)。因此,从read_csv()或中的 URL 读取数据帧read_table()现在支持其他压缩方法:xzbz2zip( GH 14570 )。以前,仅gzip支持压缩。默认情况下,现在使用文件扩展名推断 URL 和路径的压缩。此外,改进了 python 2 C 引擎中对 bz2 压缩的支持 ( GH 14874 )。

In [20]: url = ('https://github.com/{repo}/raw/{branch}/{path}'
   ....:        .format(repo='pandas-dev/pandas',
   ....:                branch='main',
   ....:                path='pandas/tests/io/parser/data/salaries.csv.bz2'))
   ....: 

# default, infer compression
In [21]: df = pd.read_csv(url, sep='\t', compression='infer')

# explicitly specify compression
In [22]: df = pd.read_csv(url, sep='\t', compression='bz2')

In [23]: df.head(2)
Out[23]: 
       S  X  E  M
0  13876  1  1  1
1  11608  1  3  0

[2 rows x 4 columns]

Pickle 文件 IO 现在支持压缩#

read_pickle()DataFrame.to_pickle()现在Series.to_pickle() 可以读取和写入压缩的 pickle 文件。压缩方法可以是显式参数,也可以从文件扩展名推断出来。请参阅此处的文档。

In [24]: df = pd.DataFrame({'A': np.random.randn(1000),
   ....:                    'B': 'foo',
   ....:                    'C': pd.date_range('20130101', periods=1000, freq='s')})
   ....: 

使用显式压缩类型

In [25]: df.to_pickle("data.pkl.compress", compression="gzip")

In [26]: rt = pd.read_pickle("data.pkl.compress", compression="gzip")

In [27]: rt.head()
Out[27]: 
          A    B                   C
0 -1.344312  foo 2013-01-01 00:00:00
1  0.844885  foo 2013-01-01 00:00:01
2  1.075770  foo 2013-01-01 00:00:02
3 -0.109050  foo 2013-01-01 00:00:03
4  1.643563  foo 2013-01-01 00:00:04

[5 rows x 3 columns]

默认是从扩展名 ( ) 推断压缩类型compression='infer'

In [28]: df.to_pickle("data.pkl.gz")

In [29]: rt = pd.read_pickle("data.pkl.gz")

In [30]: rt.head()
Out[30]: 
          A    B                   C
0 -1.344312  foo 2013-01-01 00:00:00
1  0.844885  foo 2013-01-01 00:00:01
2  1.075770  foo 2013-01-01 00:00:02
3 -0.109050  foo 2013-01-01 00:00:03
4  1.643563  foo 2013-01-01 00:00:04

[5 rows x 3 columns]

In [31]: df["A"].to_pickle("s1.pkl.bz2")

In [32]: rt = pd.read_pickle("s1.pkl.bz2")

In [33]: rt.head()
Out[33]: 
0   -1.344312
1    0.844885
2    1.075770
3   -0.109050
4    1.643563
Name: A, Length: 5, dtype: float64

UInt64 支持改进#

pandas 显着改进了对涉及无符号或纯非负整数的操作的支持。以前,处理这些整数会导致不正确的舍入或数据类型转换,从而导致不正确的结果。值得注意的是,UInt64Index已经创建了一个新的数字索引( GH 14937 )

In [1]: idx = pd.UInt64Index([1, 2, 3])
In [2]: df = pd.DataFrame({'A': ['a', 'b', 'c']}, index=idx)
In [3]: df.index
Out[3]: UInt64Index([1, 2, 3], dtype='uint64')
  • 将类数组对象的对象元素转换为无符号 64 位整数时出现错误(GH 4471GH 14982

  • Series.unique()无符号 64 位整数导致溢出的错误( GH 14721 )

  • DataFrame将无符号 64 位整数元素转换为对象的构造错误( GH 14881 )

  • pd.read_csv()无符号 64 位整数元素被错误地转换为错误数据类型的错误( GH 14983 )

  • pd.unique()无符号 64 位整数导致溢出的错误( GH 14915 )

  • pd.value_counts()无符号 64 位整数在输出中被错误截断的错误( GH 14934 )

分类上的 GroupBy #

在以前的版本中,当对某些类别未出现在数据中的分类系列进行分组时,将会失败。 (GH 13179.groupby(..., sort=False)ValueError

In [34]: chromosomes = np.r_[np.arange(1, 23).astype(str), ['X', 'Y']]

In [35]: df = pd.DataFrame({
   ....:     'A': np.random.randint(100),
   ....:     'B': np.random.randint(100),
   ....:     'C': np.random.randint(100),
   ....:     'chromosomes': pd.Categorical(np.random.choice(chromosomes, 100),
   ....:                                   categories=chromosomes,
   ....:                                   ordered=True)})
   ....: 

In [36]: df
Out[36]: 
     A   B   C chromosomes
0   87  22  81           4
1   87  22  81          13
2   87  22  81          22
3   87  22  81           2
4   87  22  81           6
..  ..  ..  ..         ...
95  87  22  81           8
96  87  22  81          11
97  87  22  81           X
98  87  22  81           1
99  87  22  81          19

[100 rows x 4 columns]

以前的行为

In [3]: df[df.chromosomes != '1'].groupby('chromosomes', observed=False, sort=False).sum()
---------------------------------------------------------------------------
ValueError: items in new_categories are not the same as in old categories

新行为

In [37]: df[df.chromosomes != '1'].groupby('chromosomes', observed=False, sort=False).sum()
Out[37]: 
               A   B    C
chromosomes              
4            348  88  324
13           261  66  243
22           348  88  324
2            348  88  324
6            174  44  162
...          ...  ..  ...
3            348  88  324
11           348  88  324
19           174  44  162
1              0   0    0
21             0   0    0

[24 rows x 3 columns]

表模式输出#

新的 orient 'table'forDataFrame.to_json() 将生成数据的表模式兼容的字符串表示形式。

In [38]: df = pd.DataFrame(
   ....:     {'A': [1, 2, 3],
   ....:      'B': ['a', 'b', 'c'],
   ....:      'C': pd.date_range('2016-01-01', freq='d', periods=3)},
   ....:     index=pd.Index(range(3), name='idx'))
   ....: 

In [39]: df
Out[39]: 
     A  B          C
idx                 
0    1  a 2016-01-01
1    2  b 2016-01-02
2    3  c 2016-01-03

[3 rows x 3 columns]

In [40]: df.to_json(orient='table')
Out[40]: '{"schema":{"fields":[{"name":"idx","type":"integer"},{"name":"A","type":"integer"},{"name":"B","type":"string"},{"name":"C","type":"datetime"}],"primaryKey":["idx"],"pandas_version":"1.4.0"},"data":[{"idx":0,"A":1,"B":"a","C":"2016-01-01T00:00:00.000"},{"idx":1,"A":2,"B":"b","C":"2016-01-02T00:00:00.000"},{"idx":2,"A":3,"B":"c","C":"2016-01-03T00:00:00.000"}]}'

有关详细信息,请参阅IO:表架构

此外,如果您使用 IPython(或其他前端,例如使用 Jupyter 消息协议的nteractDataFrame ),则Series现在可以发布 Series 或 DataFrame 的 JSON 表模式表示。这为 Jupyter Notebook 和nteract等前端 在显示 pandas 对象的方式上提供了更大的灵活性,因为它们拥有更多有关数据的信息。您必须通过将该选项设置为 来启用此功能。display.html.table_schemaTrue

SciPy 稀疏矩阵从/到 SparseDataFrame #

pandas 现在支持直接从scipy.sparse.spmatrix实例创建稀疏数据帧。请参阅文档以获取更多信息。 (GH 4343

支持所有稀疏格式,但不符合COOrdinate格式的矩阵将被转换,并根据需要复制数据。

from scipy.sparse import csr_matrix
arr = np.random.random(size=(1000, 5))
arr[arr < .9] = 0
sp_arr = csr_matrix(arr)
sp_arr
sdf = pd.SparseDataFrame(sp_arr)
sdf

SparseDataFrame要将COO 格式转换回稀疏 SciPy 矩阵,您可以使用:

sdf.to_coo()

样式化 DataFrame 的 Excel 输出#

添加了实验性支持,DataFrame.style可使用该引擎将格式导出到 Excel openpyxl。 (GH 15530

例如,运行以下命令后,styled.xlsx呈现如下:

In [41]: np.random.seed(24)

In [42]: df = pd.DataFrame({'A': np.linspace(1, 10, 10)})

In [43]: df = pd.concat([df, pd.DataFrame(np.random.RandomState(24).randn(10, 4),
   ....:                                  columns=list('BCDE'))],
   ....:                axis=1)
   ....: 

In [44]: df.iloc[0, 2] = np.nan

In [45]: df
Out[45]: 
      A         B         C         D         E
0   1.0  1.329212       NaN -0.316280 -0.990810
1   2.0 -1.070816 -1.438713  0.564417  0.295722
2   3.0 -1.626404  0.219565  0.678805  1.889273
3   4.0  0.961538  0.104011 -0.481165  0.850229
4   5.0  1.453425  1.057737  0.165562  0.515018
5   6.0 -1.336936  0.562861  1.392855 -0.063328
6   7.0  0.121668  1.207603 -0.002040  1.627796
7   8.0  0.354493  1.037528 -0.385684  0.519818
8   9.0  1.686583 -1.325963  1.428984 -2.089354
9  10.0 -0.129820  0.631523 -0.586538  0.290720

[10 rows x 5 columns]

In [46]: styled = (df.style
   ....:           .applymap(lambda val: 'color:red;' if val < 0 else 'color:black;')
   ....:           .highlight_max())
   ....: 

In [47]: styled.to_excel('styled.xlsx', engine='openpyxl')
../_images/style-excel.png

有关更多详细信息,请参阅样式文档。

间隔索引#

pandas 获得了IntervalIndex自己的 dtypeinterval以及Interval标量类型。这些允许对区间表示法的一流支持,特别是作为cut()和中类别的返回类型qcut()。允许IntervalIndex一些唯一的索引,请参阅 文档。 (GH 7640GH 8625

警告

IntervalIndex 的这些索引行为是临时的,可能会在 pandas 的未来版本中发生变化。欢迎反馈使用情况。

以前的行为:

返回的类别是字符串,代表Intervals

In [1]: c = pd.cut(range(4), bins=2)

In [2]: c
Out[2]:
[(-0.003, 1.5], (-0.003, 1.5], (1.5, 3], (1.5, 3]]
Categories (2, object): [(-0.003, 1.5] < (1.5, 3]]

In [3]: c.categories
Out[3]: Index(['(-0.003, 1.5]', '(1.5, 3]'], dtype='object')

新行为:

In [48]: c = pd.cut(range(4), bins=2)

In [49]: c
Out[49]: 
[(-0.003, 1.5], (-0.003, 1.5], (1.5, 3.0], (1.5, 3.0]]
Categories (2, interval[float64, right]): [(-0.003, 1.5] < (1.5, 3.0]]

In [50]: c.categories
Out[50]: IntervalIndex([(-0.003, 1.5], (1.5, 3.0]], dtype='interval[float64, right]')

此外,这允许将其他数据与这些相同的 bin 进行分箱,并NaN表示与其他数据类型类似的缺失值。

In [51]: pd.cut([0, 3, 5, 1], bins=c.categories)
Out[51]: 
[(-0.003, 1.5], (1.5, 3.0], NaN, (-0.003, 1.5]]
Categories (2, interval[float64, right]): [(-0.003, 1.5] < (1.5, 3.0]]

AnIntervalIndex也可以用在Series和中DataFrame作为索引。

In [52]: df = pd.DataFrame({'A': range(4),
   ....:                    'B': pd.cut([0, 3, 1, 1], bins=c.categories)
   ....:                    }).set_index('B')
   ....: 

In [53]: df
Out[53]: 
               A
B               
(-0.003, 1.5]  0
(1.5, 3.0]     1
(-0.003, 1.5]  2
(-0.003, 1.5]  3

[4 rows x 1 columns]

通过特定间隔选择:

In [54]: df.loc[pd.Interval(1.5, 3.0)]
Out[54]: 
A    1
Name: (1.5, 3.0], Length: 1, dtype: int64

通过间隔包含的标量值进行选择。

In [55]: df.loc[0]
Out[55]: 
               A
B               
(-0.003, 1.5]  0
(-0.003, 1.5]  2
(-0.003, 1.5]  3

[3 rows x 1 columns]

其他增强功能#

  • DataFrame.rolling()现在接受参数closed='right'|'left'|'both'|'neither'来选择滚动窗口端点封闭性。请参阅文档GH 13965

  • 与 的集成feather-format,包括新的顶层pd.read_feather()DataFrame.to_feather()方法,请参见此处

  • Series.str.replace()现在接受一个可调用的,作为替换,它被传递到re.subGH 15055

  • Series.str.replace()现在接受已编译的正则表达式作为模式(GH 15446

  • Series.sort_index接受参数kindna_positionGH 13589GH 14444

  • DataFrameDataFrame.groupby()获得了一种nunique()计算轴上不同值的方法(GH 14336GH 15197)。

  • DataFrame已经获得了一种melt()方法,相当于pd.melt(),用于从宽格式转为长格式(GH 12640)。

  • pd.read_excel()现在使用时保留图纸顺序sheetname=NoneGH 9930

  • 现在支持带小数点的多个偏移别名(例如0.5min解析为30s)(GH 8419

  • .isnull().notnull()已添加到Index对象中以使它们与SeriesAPI 更加一致(GH 15300

  • 当索引/切片到未排序的 MultiIndex ( GH 11897 ) 时引发新的UnsortedIndexError( 的子类) 。这允许区分由于缺乏排序或不正确的键而导致的错误。看这里KeyError

  • MultiIndex已经获得了.to_frame()转换为DataFrameGH 12397)的方法

  • pd.cut现在pd.qcut支持 datetime64 和 timedelta64 dtypes ( GH 14714 , GH 14798 )

  • pd.qcut获得了duplicates='raise'|'drop'控制是否在重复边上加注的选项(GH 7751

  • Series提供了to_excel输出Excel文件的方法(GH 8825

  • usecols现在的参数接受pd.read_csv()一个可调用函数作为值(GH 14154

  • skiprows现在的参数接受pd.read_csv()一个可调用函数作为值(GH 10882

  • 如果两者都通过,则支持nrows和参数chunksizeGH 6774GH 15755pd.read_csv()

  • DataFrame.plotsuplots=True现在,如果和title是字符串列表,则在每个子图上方打印标题( GH 14753

  • DataFrame.plot可以将 matplotlib 2.0 默认颜色循环作为单个字符串作为颜色参数传递,请参见此处。 (GH 15516

  • Series.interpolate()现在支持 timedelta 作为索引类型method='time'GH 6424

  • 添加level关键字以重命名 MultiIndex ( GH 4160DataFrame/Series.rename )指定级别中的标签。

  • DataFrame.reset_index()如果这是一个(GH 16164),现在会将元组解释index.name为跨级别的键columnsMultiIndex

  • Timedelta.isoformat添加了用于将 Timedeltas 格式化为ISO 8601 持续时间 的方法。请参阅Timedelta 文档( GH 15136 )

  • .select_dtypes()现在允许字符串datetimetz一般使用 tz 选择日期时间 ( GH 14910 )

  • .to_latex()方法现在将接受multicolumn参数multirow以使用随附的 LaTeX 增强功能

  • pd.merge_asof()获得了选项direction='backward'|'forward'|'nearest'GH 14887

  • Series/DataFrame.asfreq()获得了一个fill_value参数,以填充缺失值(GH 3715)。

  • Series/DataFrame.resample.asfreq获得了一个fill_value参数,用于在重采样期间填充缺失值(GH 3715)。

  • pandas.util.hash_pandas_object()已经获得了散列 a 的能力MultiIndexGH 15224

  • Series/DataFrame.squeeze()已经获得axis参数。 (GH 15339

  • DataFrame.to_excel()有一个新freeze_panes参数可以在导出到 Excel 时打开冻结窗格 ( GH 15160 )

  • pd.read_html()将解析多个标题行,创建一个 MultiIndex 标题。 (GH 13434)。

  • 如果等于 1,则HTML 表输出跳过colspan或属性。( GH 15403 )rowspan

  • pandas.io.formats.style.Styler模板现在具有更容易扩展的块,请参阅示例笔记本GH 15649

  • Styler.render()现在允许**kwargs在模板中使用用户定义的变量(GH 15649

  • 兼容Jupyter笔记本5.0; MultiIndex 列标签左对齐,MultiIndex 行标签顶部对齐 ( GH 15379 )

  • TimedeltaIndex现在有一个专门为纳秒级精度设计的自定义日期刻度格式化程序(GH 8711

  • pd.api.types.union_categoricals获得了ignore_ordered允许忽略联合分类的有序属性的参数(GH 13410)。有关更多信息,请参阅分类联合文档。

  • DataFrame.to_latex()现在DataFrame.to_string()允许可选的标头别名。 (GH 15536 ​​)

  • 重新启用parse_dates关键字 ofpd.read_excel()将字符串列解析为日期(GH 14326

  • .empty向 的子类添加了属性Index。 (GH 15270

  • 启用Timedelta和 的楼层划分TimedeltaIndexGH 15828

  • pandas.io.json.json_normalize()获得了选择权errors='ignore'|'raise';默认值是errors='raise'向后兼容的。 (GH 14583

  • pandas.io.json.json_normalize()为空list将返回空DataFrameGH 15534

  • pandas.io.json.json_normalize()获得了接受分隔连接字段sep的选项;str默认为“.”,向后兼容。 (GH 14883

  • MultiIndex.remove_unused_levels()已添加以方便删除未使用的级别。 (GH 15694

  • pd.read_csv()ParserError现在,每当发生任何解析错误时都会引发错误( GH 15913GH 15925

  • pd.read_csv()现在支持Python 解析器的error_bad_lines和参数 ( GH 15925 )warn_bad_lines

  • display.show_dimensions选项现在还可以用于指定是否Series应在其 repr 中显示 a 的长度(GH 7117)。

  • parallel_coordinates()获得了一个sort_labels关键字参数,用于对类标签和分配给它们的颜色进行排序(GH 15908

  • bottleneck添加选项以允许使用和来打开/关闭numexpr,请参阅此处GH 16157

  • DataFrame.style.bar()现在接受另外两个选项来进一步自定义条形图。 Bar对齐方式通过 设置align='left'|'mid'|'zero',默认为“left”,向后兼容;您现在可以传递. (GH 14757color=[color_negative, color_positive]

向后不兼容的 API 更改#

使用 pandas < 0.13.0 创建的 HDF5 格式可能不兼容#

pd.TimeSeries在 0.17.0 中已正式弃用,但自 0.13.0 起已成为别名。它已被放弃,取而代之的是pd.Series。 (GH 15098)。

如果使用的话,这可能会导致在早期版本中创建的 HDF5 文件变得不可读。pd.TimeSeries这最有可能适用于 < 0.13.0 的 pandas。如果您发现自己处于这种情况。您可以使用最新版本的 pandas 读取 HDF5 文件,然后在应用以下过程后再次将其写出。

In [2]: s = pd.TimeSeries([1, 2, 3], index=pd.date_range('20130101', periods=3))

In [3]: s
Out[3]:
2013-01-01    1
2013-01-02    2
2013-01-03    3
Freq: D, dtype: int64

In [4]: type(s)
Out[4]: pandas.core.series.TimeSeries

In [5]: s = pd.Series(s)

In [6]: s
Out[6]:
2013-01-01    1
2013-01-02    2
2013-01-03    3
Freq: D, dtype: int64

In [7]: type(s)
Out[7]: pandas.core.series.Series

索引类型上的映射现在返回其他索引类型#

map现在Index返回 an Index,而不是 numpy 数组(GH 12766

In [56]: idx = pd.Index([1, 2])

In [57]: idx
Out[57]: Index([1, 2], dtype='int64')

In [58]: mi = pd.MultiIndex.from_tuples([(1, 2), (2, 4)])

In [59]: mi
Out[59]: 
MultiIndex([(1, 2),
            (2, 4)],
           )

以前的行为:

In [5]: idx.map(lambda x: x * 2)
Out[5]: array([2, 4])

In [6]: idx.map(lambda x: (x, x * 2))
Out[6]: array([(1, 2), (2, 4)], dtype=object)

In [7]: mi.map(lambda x: x)
Out[7]: array([(1, 2), (2, 4)], dtype=object)

In [8]: mi.map(lambda x: x[0])
Out[8]: array([1, 2])

新行为:

In [60]: idx.map(lambda x: x * 2)
Out[60]: Index([2, 4], dtype='int64')

In [61]: idx.map(lambda x: (x, x * 2))
Out[61]: 
MultiIndex([(1, 2),
            (2, 4)],
           )

In [62]: mi.map(lambda x: x)
Out[62]: 
MultiIndex([(1, 2),
            (2, 4)],
           )

In [63]: mi.map(lambda x: x[0])
Out[63]: Index([1, 2], dtype='int64')

mapSeries带有datetime64值的情况下可能会返回int64dtypes 而不是int32

In [64]: s = pd.Series(pd.date_range('2011-01-02T00:00', '2011-01-02T02:00', freq='H')
   ....:               .tz_localize('Asia/Tokyo'))
   ....:

In [65]: s
Out[65]:
0   2011-01-02 00:00:00+09:00
1   2011-01-02 01:00:00+09:00
2   2011-01-02 02:00:00+09:00
Length: 3, dtype: datetime64[ns, Asia/Tokyo]

以前的行为:

In [9]: s.map(lambda x: x.hour)
Out[9]:
0    0
1    1
2    2
dtype: int32

新行为:

In [66]: s.map(lambda x: x.hour)
Out[66]:
0    0
1    1
2    2
Length: 3, dtype: int64

访问 Index 的日期时间字段现在返回 Index #

和之前返回的 numpy 数组的日期时间相关属性(请参阅此处 了解概述) 。它们现在将返回一个新对象,但布尔字段的情况除外,其结果仍然是布尔 ndarray。 (GH 15022DatetimeIndexPeriodIndexTimedeltaIndexIndex

以前的行为:

In [1]: idx = pd.date_range("2015-01-01", periods=5, freq='10H')

In [2]: idx.hour
Out[2]: array([ 0, 10, 20,  6, 16], dtype=int32)

新行为:

In [67]: idx = pd.date_range("2015-01-01", periods=5, freq='10H')

In [68]: idx.hour
Out[68]: Index([0, 10, 20, 6, 16], dtype='int32')

这样做的优点是Index仍然可以对结果使用特定的方法。另一方面,这可能具有向后不兼容性:例如,与 numpy 数组相比,Index对象是不可变的。要获取原始 ndarray,您始终可以使用 显式转换np.asarray(idx.hour)

pd.unique 现在将与扩展类型一致#

在之前的版本中,使用Series.unique()and pandas.unique()onCategorical和 tz 感知数据类型会产生不同的返回类型。这些现在已变得一致。 (GH 15903

  • 日期时间 tz 感知

    以前的行为:

    # Series
    In [5]: pd.Series([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:            pd.Timestamp('20160101', tz='US/Eastern')]).unique()
    Out[5]: array([Timestamp('2016-01-01 00:00:00-0500', tz='US/Eastern')], dtype=object)
    
    In [6]: pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:                      pd.Timestamp('20160101', tz='US/Eastern')]))
    Out[6]: array(['2016-01-01T05:00:00.000000000'], dtype='datetime64[ns]')
    
    # Index
    In [7]: pd.Index([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:           pd.Timestamp('20160101', tz='US/Eastern')]).unique()
    Out[7]: DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
    
    In [8]: pd.unique([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:            pd.Timestamp('20160101', tz='US/Eastern')])
    Out[8]: array(['2016-01-01T05:00:00.000000000'], dtype='datetime64[ns]')
    

    新行为:

    # Series, returns an array of Timestamp tz-aware
    In [64]: pd.Series([pd.Timestamp(r'20160101', tz=r'US/Eastern'),
       ....:            pd.Timestamp(r'20160101', tz=r'US/Eastern')]).unique()
       ....: 
    Out[64]: 
    <DatetimeArray>
    ['2016-01-01 00:00:00-05:00']
    Length: 1, dtype: datetime64[ns, US/Eastern]
    
    In [65]: pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'),
       ....:           pd.Timestamp('20160101', tz='US/Eastern')]))
       ....: 
    Out[65]: 
    <DatetimeArray>
    ['2016-01-01 00:00:00-05:00']
    Length: 1, dtype: datetime64[ns, US/Eastern]
    
    # Index, returns a DatetimeIndex
    In [66]: pd.Index([pd.Timestamp('20160101', tz='US/Eastern'),
       ....:           pd.Timestamp('20160101', tz='US/Eastern')]).unique()
       ....: 
    Out[66]: DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
    
    In [67]: pd.unique(pd.Index([pd.Timestamp('20160101', tz='US/Eastern'),
       ....:                     pd.Timestamp('20160101', tz='US/Eastern')]))
       ....: 
    Out[67]: DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
    
  • 分类

    以前的行为:

    In [1]: pd.Series(list('baabc'), dtype='category').unique()
    Out[1]:
    [b, a, c]
    Categories (3, object): [b, a, c]
    
    In [2]: pd.unique(pd.Series(list('baabc'), dtype='category'))
    Out[2]: array(['b', 'a', 'c'], dtype=object)
    

    新行为:

    # returns a Categorical
    In [68]: pd.Series(list('baabc'), dtype='category').unique()
    Out[68]: 
    ['b', 'a', 'c']
    Categories (3, object): ['a', 'b', 'c']
    
    In [69]: pd.unique(pd.Series(list('baabc'), dtype='category'))
    Out[69]: 
    ['b', 'a', 'c']
    Categories (3, object): ['a', 'b', 'c']
    

S3 文件处理#

pandas 现在使用s3fs来处理 S3 连接。这不应该破坏任何代码。但是,由于s3fs不是必需的依赖项,因此您需要单独安装它,就像boto 以前版本的 pandas 一样。 (GH 11915)。

部分字符串索引更改#

DatetimeIndex 部分字符串索引现在可以作为精确匹配,前提是字符串分辨率与索引分辨率一致,包括两者均为秒的情况 ( GH 14826 )。请参阅切片与精确匹配

In [70]: df = pd.DataFrame({'a': [1, 2, 3]}, pd.DatetimeIndex(['2011-12-31 23:59:59',
   ....:                                                       '2012-01-01 00:00:00',
   ....:                                                       '2012-01-01 00:00:01']))
   ....: 

以前的行为:

In [4]: df['2011-12-31 23:59:59']
Out[4]:
                       a
2011-12-31 23:59:59  1

In [5]: df['a']['2011-12-31 23:59:59']
Out[5]:
2011-12-31 23:59:59    1
Name: a, dtype: int64

新行为:

In [4]: df['2011-12-31 23:59:59']
KeyError: '2011-12-31 23:59:59'

In [5]: df['a']['2011-12-31 23:59:59']
Out[5]: 1

不同 float 数据类型的连接不会自动向上转换#

以前,concat具有不同floatdtype 的多个对象会自动将结果向上转换为 dtype float64。现在将使用最小的可接受的数据类型(GH 13247

In [71]: df1 = pd.DataFrame(np.array([1.0], dtype=np.float32, ndmin=2))

In [72]: df1.dtypes
Out[72]: 
0    float32
Length: 1, dtype: object

In [73]: df2 = pd.DataFrame(np.array([np.nan], dtype=np.float32, ndmin=2))

In [74]: df2.dtypes
Out[74]: 
0    float32
Length: 1, dtype: object

以前的行为:

In [7]: pd.concat([df1, df2]).dtypes
Out[7]:
0    float64
dtype: object

新行为:

In [75]: pd.concat([df1, df2]).dtypes
Out[75]: 
0    float32
Length: 1, dtype: object

pandas Google BigQuery 支持已转移#

pandas 已将 Google BigQuery 支持分离到一个单独的包中pandas-gbq。你可以或者 得到它。的功能与当前发布的版本保持相同。文档现在托管在此处( GH 15347 )conda install pandas-gbq -c conda-forgepip install pandas-gbqread_gbq()DataFrame.to_gbq()pandas-gbq=0.1.4

Index 的内存使用情况更准确#

在以前的版本中,.memory_usage()在具有索引的 pandas 结构上显示时,仅包含实际索引值,而不包含有助于快速索引的结构。对于其他索引类型,这通常会有所不同IndexMultiIndexGH 15237

以前的行为:

In [8]: index = pd.Index(['foo', 'bar', 'baz'])

In [9]: index.memory_usage(deep=True)
Out[9]: 180

In [10]: index.get_loc('foo')
Out[10]: 0

In [11]: index.memory_usage(deep=True)
Out[11]: 180

新行为:

In [8]: index = pd.Index(['foo', 'bar', 'baz'])

In [9]: index.memory_usage(deep=True)
Out[9]: 180

In [10]: index.get_loc('foo')
Out[10]: 0

In [11]: index.memory_usage(deep=True)
Out[11]: 260

DataFrame.sort_index 更改#

在某些情况下,调用.sort_index()MultiIndexed DataFrame 将返回相同的DataFrame,但似乎没有排序。这会发生在lexsorted,但非单调水平上。 (GH 15622GH 15687GH 14015GH 13431GH 15797

这与之前的版本没有变化,但出于说明目的而显示:

In [81]: df = pd.DataFrame(np.arange(6), columns=['value'],
   ....:                   index=pd.MultiIndex.from_product([list('BA'), range(3)]))
   ....:
In [82]: df

Out[82]:
     value
B 0      0
  1      1
  2      2
A 0      3
  1      4
  2      5

[6 rows x 1 columns]
In [87]: df.index.is_lexsorted()
Out[87]: False

In [88]: df.index.is_monotonic
Out[88]: False

排序按预期进行

In [76]: df.sort_index()
Out[76]: 
                     a
2011-12-31 23:59:59  1
2012-01-01 00:00:00  2
2012-01-01 00:00:01  3

[3 rows x 1 columns]
In [90]: df.sort_index().index.is_lexsorted()
Out[90]: True

In [91]: df.sort_index().index.is_monotonic
Out[91]: True

但是,此示例具有非单调的第二级,其行为并不符合预期。

In [77]: df = pd.DataFrame({'value': [1, 2, 3, 4]},
   ....:                   index=pd.MultiIndex([['a', 'b'], ['bb', 'aa']],
   ....:                                       [[0, 0, 1, 1], [0, 1, 0, 1]]))
   ....: 

In [78]: df
Out[78]: 
      value
a bb      1
  aa      2
b bb      3
  aa      4

[4 rows x 1 columns]

以前的行为:

In [11]: df.sort_index()
Out[11]:
      value
a bb      1
  aa      2
b bb      3
  aa      4

In [14]: df.sort_index().index.is_lexsorted()
Out[14]: True

In [15]: df.sort_index().index.is_monotonic
Out[15]: False

新行为:

In [94]: df.sort_index()
Out[94]:
      value
a aa      2
  bb      1
b aa      4
  bb      3

[4 rows x 1 columns]

In [95]: df.sort_index().index.is_lexsorted()
Out[95]: True

In [96]: df.sort_index().index.is_monotonic
Out[96]: True

GroupBy 描述格式#

groupby.describe()现在的输出格式标记describe()列中的指标而不是索引。此格式与groupby.agg()一次应用多个函数时一致。 (GH 4792

以前的行为:

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

In [2]: df.groupby('A').describe()
Out[2]:
                B
A
1 count  2.000000
  mean   1.500000
  std    0.707107
  min    1.000000
  25%    1.250000
  50%    1.500000
  75%    1.750000
  max    2.000000
2 count  2.000000
  mean   3.500000
  std    0.707107
  min    3.000000
  25%    3.250000
  50%    3.500000
  75%    3.750000
  max    4.000000

In [3]: df.groupby('A').agg(["mean", "std", "min", "max"])
Out[3]:
     B
  mean       std amin amax
A
1  1.5  0.707107    1    2
2  3.5  0.707107    3    4

新行为:

In [79]: df = pd.DataFrame({'A': [1, 1, 2, 2], 'B': [1, 2, 3, 4]})

In [80]: df.groupby('A').describe()
Out[80]: 
      B                                          
  count mean       std  min   25%  50%   75%  max
A                                                
1   2.0  1.5  0.707107  1.0  1.25  1.5  1.75  2.0
2   2.0  3.5  0.707107  3.0  3.25  3.5  3.75  4.0

[2 rows x 8 columns]

In [81]: df.groupby('A').agg(["mean", "std", "min", "max"])
Out[81]: 
     B                  
  mean       std min max
A                       
1  1.5  0.707107   1   2
2  3.5  0.707107   3   4

[2 rows x 4 columns]

窗口二进制 corr/cov 操作返回 MultiIndex DataFrame #

二进制窗口操作(例如.corr()or .cov())在对.rolling(..).expanding(..).ewm(..)对象进行操作时,现在将返回 2 级而不是,现在已弃用,请参见此处。它们在功能上是等效的,但 MultiIndexed在 pandas 中享有更多支持。有关详细信息,请参阅有关窗口二元运算的部分。 (GH 15677MultiIndexed DataFramePanelPanelDataFrame

In [82]: np.random.seed(1234)

In [83]: df = pd.DataFrame(np.random.rand(100, 2),
   ....:                   columns=pd.Index(['A', 'B'], name='bar'),
   ....:                   index=pd.date_range('20160101',
   ....:                                       periods=100, freq='D', name='foo'))
   ....: 

In [84]: df.tail()
Out[84]: 
bar                A         B
foo                           
2016-04-05  0.640880  0.126205
2016-04-06  0.171465  0.737086
2016-04-07  0.127029  0.369650
2016-04-08  0.604334  0.103104
2016-04-09  0.802374  0.945553

[5 rows x 2 columns]

以前的行为:

In [2]: df.rolling(12).corr()
Out[2]:
<class 'pandas.core.panel.Panel'>
Dimensions: 100 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: 2016-01-01 00:00:00 to 2016-04-09 00:00:00
Major_axis axis: A to B
Minor_axis axis: A to B

新行为:

In [85]: res = df.rolling(12).corr()

In [86]: res.tail()
Out[86]: 
bar                    A         B
foo        bar                    
2016-04-07 B   -0.132090  1.000000
2016-04-08 A    1.000000 -0.145775
           B   -0.145775  1.000000
2016-04-09 A    1.000000  0.119645
           B    0.119645  1.000000

[5 rows x 2 columns]

检索横截面的相关矩阵

In [87]: df.rolling(12).corr().loc['2016-04-07']
Out[87]: 
bar        A        B
bar                  
A    1.00000 -0.13209
B   -0.13209  1.00000

[2 rows x 2 columns]

HDFStore where 字符串比较#

在以前的版本中,大多数类型可以与字符串列进行比较,HDFStore 通常会导致无效比较,返回空结果帧。这些比较现在将提出 TypeErrorGH 15492

In [88]: df = pd.DataFrame({'unparsed_date': ['2014-01-01', '2014-01-01']})

In [89]: df.to_hdf('store.h5', key='key', format='table', data_columns=True)

In [90]: df.dtypes
Out[90]: 
unparsed_date    object
Length: 1, dtype: object

以前的行为:

In [4]: pd.read_hdf('store.h5', 'key', where='unparsed_date > ts')
File "<string>", line 1
  (unparsed_date > 1970-01-01 00:00:01.388552400)
                        ^
SyntaxError: invalid token

新行为:

In [18]: ts = pd.Timestamp('2014-01-01')

In [19]: pd.read_hdf('store.h5', 'key', where='unparsed_date > ts')
TypeError: Cannot compare 2014-01-01 00:00:00 of
type <class 'pandas.tslib.Timestamp'> to string column

Index.intersection 和内部连接现在保留左侧索引的顺序#

Index.intersection()现在保留调用的顺序Index(左)而不是另一个Index(右)(GH 15582)。这会影响内部连接、DataFrame.join()and merge()、 以及.align方法。

  • Index.intersection

    In [91]: left = pd.Index([2, 1, 0])
    
    In [92]: left
    Out[92]: Index([2, 1, 0], dtype='int64')
    
    In [93]: right = pd.Index([1, 2, 3])
    
    In [94]: right
    Out[94]: Index([1, 2, 3], dtype='int64')
    

    以前的行为:

    In [4]: left.intersection(right)
    Out[4]: Int64Index([1, 2], dtype='int64')
    

    新行为:

    In [95]: left.intersection(right)
    Out[95]: Index([2, 1], dtype='int64')
    
  • DataFrame.joinpd.merge

    In [96]: left = pd.DataFrame({'a': [20, 10, 0]}, index=[2, 1, 0])
    
    In [97]: left
    Out[97]: 
        a
    2  20
    1  10
    0   0
    
    [3 rows x 1 columns]
    
    In [98]: right = pd.DataFrame({'b': [100, 200, 300]}, index=[1, 2, 3])
    
    In [99]: right
    Out[99]: 
         b
    1  100
    2  200
    3  300
    
    [3 rows x 1 columns]
    

    以前的行为:

    In [4]: left.join(right, how='inner')
    Out[4]:
       a    b
    1  10  100
    2  20  200
    

    新行为:

    In [100]: left.join(right, how='inner')
    Out[100]: 
        a    b
    2  20  200
    1  10  100
    
    [2 rows x 2 columns]
    

数据透视表总是返回一个 DataFrame #

的文档pivot_table()指出 a总是DataFrame被返回。这里修复了一个错误,该错误允许在某些情况下返回 a 。 (GH 4386Series

In [101]: df = pd.DataFrame({'col1': [3, 4, 5],
   .....:                    'col2': ['C', 'D', 'E'],
   .....:                    'col3': [1, 3, 9]})
   .....: 

In [102]: df
Out[102]: 
   col1 col2  col3
0     3    C     1
1     4    D     3
2     5    E     9

[3 rows x 3 columns]

以前的行为:

In [2]: df.pivot_table('col1', index=['col3', 'col2'], aggfunc="sum")
Out[2]:
col3  col2
1     C       3
3     D       4
9     E       5
Name: col1, dtype: int64

新行为:

In [103]: df.pivot_table('col1', index=['col3', 'col2'], aggfunc="sum")
Out[103]: 
           col1
col3 col2      
1    C        3
3    D        4
9    E        5

[3 rows x 1 columns]

其他 API 更改#

  • numexpr现在要求版本 >= 2.4.6,如果不满足此要求(GH 15213),则根本不会使用它。

  • CParserError已重命名为ParserErrorinpd.read_csv()并将在将来删除 ( GH 12665 )

  • SparseArray.cumsum()现在SparseSeries.cumsum()将始终分别返回SparseArraySparseSeries( GH 12855 )

  • DataFrame.applymap()带有空的DataFrame将返回空的副本DataFrame而不是SeriesGH 8222

  • Series.map()现在使用方法尊重字典子类的默认值__missing__,例如collections.CounterGH 15999

  • .loc.ix与接受迭代器和 NamedTuples ( GH 15120 )兼容

  • interpolate()如果关键字参数不大于 0,则会fillna()引发 a。 ( GH 9217 )ValueErrorlimit

  • pd.read_csv()现在,只要参数和用户ParserWarning提供的值存在冲突,就会发出 a ( GH 14898 )dialect

  • pd.read_csv()ValueError如果引号字符大于一个字节 ( GH 11592 ),现在将为 C 引擎引发 a

  • inplace参数现在需要一个布尔值,否则ValueError抛出 a ( GH 14189 )

  • pandas.api.types.is_datetime64_ns_dtype现在将报告Truetz 感知的 dtype,类似于pandas.api.types.is_datetime64_any_dtype

  • DataFrame.asof()如果未找到匹配项,将返回空填充Series而不是标量( GH 15118NaN

  • 对 NDFrame 对象的特定支持copy.copy()和功能( GH 15444copy.deepcopy()

  • Series.sort_values()DataFrame.sort_values()接受 bool 的单元素列表,以与( GH 15604 )的行为保持一致

  • .merge()并且.join()categorydtype 列上现在将尽可能保留类别 dtype ( GH 10409 )

  • SparseDataFrame.default_fill_value将是 0,之前是从( GH 15594 )nan返回的pd.get_dummies(..., sparse=True)

  • 默认行为Series.str.match已从提取组更改为匹配模式。自 pandas 版本 0.13.0 起,提取行为已被弃用,可以使用该Series.str.extract 方法(GH 5224 )来完成。因此,该as_indexer关键字将被忽略(不再需要指定新行为)并被弃用。

  • NaT现在将正确报告False类似日期时间的布尔运算,例如is_month_startGH 15781

  • NaT现在将正确返回np.nanandTimedelta访问Period器,例如daysand quarter( GH 15782 )

  • NaT现在将返回NaTtz_localize方法tz_convertGH 15830

  • DataFrame如果使用标量输入而不是轴调用,则Panel具有无效输入的构造函数现在将引发ValueError而不是( GH 15541 )PandasError

  • DataFrame如果使用标量输入而不是轴调用,则Panel具有无效输入的构造函数现在将引发ValueError而不是;pandas.core.common.PandasError异常PandasError也被删除。 (GH 15541

  • 异常pandas.core.common.AmbiguousIndexError被删除,因为它没有被引用(GH 15541

图书馆重组:隐私变更#

模块隐私已更改#

一些以前公共的 python/c/c++/cython 扩展模块已被移动和/或重命名。这些都已从公共 API 中删除。此外,pandas.corepandas.compatpandas.util顶级模块现在被认为是私有的。如果有指示,如果您引用这些模块,将会发出弃用警告。 (GH 12588

以前的位置

新地点

已弃用

熊猫库

pandas._libs.lib

X

pandas.tslib

pandas._libs.tslib

X

pandas.computation

pandas.core.computation

X

pandas消息包

pandas.io.msgpack

pandas.index

pandas._libs.index

pandas.algos

pandas._libs.algos

pandas.hashtable

pandas._libs.hashtable

pandas.indexes

pandas.core.indexes

熊猫.json

pandas._libs.json / pandas.io.json

X

pandas.parser

pandas._libs.parsers

X

pandas.formats

pandas.io.formats

pandas.稀疏

pandas.core.sparse

pandas工具

pandas.core.reshape

X

pandas.types

pandas.core.dtypes

X

pandas.io.sas.saslib

pandas.io.sas._sas

pandas._join

pandas._libs.join

pandas._hash

pandas._libs.hashing

pandas._period

pandas._libs.period

pandas._sparse

pandas._libs.sparse

pandas._testing

pandas._libs.testing

pandas._window

pandas._libs.window

一些新的子包是使用公共功能创建的,这些功能未直接在顶级命名空间中公开:pandas.errorspandas.plottingpandas.testing(更多详细信息如下)。与和子模块pandas.api.types中的某些功能一起,这些现在是公共子包。pandas.iopandas.tseries

进一步的变化:

  • 现在可以从( GH 15998 )union_categoricals()导入该函数pandas.api.typespandas.types.concat

  • 类型导入已弃用,可以使用(GH 16146pandas.tslib.NaTType替换type(pandas.NaT)

  • 公共函数已从pandas.tools.hashing该位置弃用,但现在可以从pandas.utilGH 16223)导入

  • pandas.util: decorators, print_versions, doctools,中validators的模块depr_module现在是私有的。只有本身暴露的功能pandas.util是公共的(GH 16223

pandas.errors#

我们正在为所有 pandas 异常和警告添加一个标准公共模块pandas.errors。 (GH 14800)。以前这些异常和警告可以从pandas.core.common或导入pandas.io.common。这些异常和警告将从*.common未来版本中的位置删除。 (GH 15541

以下内容现已成为此 API 的一部分:

['DtypeWarning',
 'EmptyDataError',
 'OutOfBoundsDatetime',
 'ParserError',
 'ParserWarning',
 'PerformanceWarning',
 'UnsortedIndexError',
 'UnsupportedFunctionCall']

pandas.testing#

pandas.testing我们正在添加一个标准模块,该模块公开( GH 9895 )中的公共测试功能。在使用 pandas 对象编写功能测试时可以使用这些函数。

以下测试功能现已成为此 API 的一部分:

pandas.plotting#

pandas.plotting添加了一个新的公共模块,该模块包含以前pandas.tools.plotting位于顶级命名空间中的绘图功能。有关更多详细信息,请参阅弃用部分。

其他开发变化#

  • 现在需要构建熊猫以进行开发(GH 14831cython >= 0.23

  • 需要至少 0.23 版本的 cython 以避免字符编码问题(GH 14699

  • 将测试框架切换为使用pytest ( GH 13097 )

  • 重组测试目录布局(GH 14854GH 15707)。

弃用#

弃用.ix#

索引.ix器已被弃用,取而代之的是更严格的索引.iloc.loc.ix在推断用户想要做什么方面提供了很多魔力。更具体地说,可以根据索引的数据类型决定按位置或通过labels.ix进行索引。多年来,这引起了相当多的用户困惑。完整的索引文档位于此处。 (GH 14218

推荐的索引方法是:

  • .loc如果你想标记索引

  • .iloc如果你想按位置索引。

使用.ix现在将在此处DeprecationWarning显示一个链接,其中包含一些如何转换代码的示例的链接。

In [104]: df = pd.DataFrame({'A': [1, 2, 3],
   .....:                    'B': [4, 5, 6]},
   .....:                   index=list('abc'))
   .....: 

In [105]: df
Out[105]: 
   A  B
a  1  4
b  2  5
c  3  6

[3 rows x 2 columns]

之前的行为,您希望从“A”列中的索引获取第 0 个和第 2 个元素。

In [3]: df.ix[[0, 2], 'A']
Out[3]:
a    1
c    3
Name: A, dtype: int64

使用.loc。这里我们将从索引中选择合适的索引,然后使用标签索引。

In [106]: df.loc[df.index[[0, 2]], 'A']
Out[106]: 
a    1
c    3
Name: A, Length: 2, dtype: int64

使用.iloc。在这里,我们将获取“A”列的位置,然后使用位置索引来选择内容。

In [107]: df.iloc[[0, 2], df.columns.get_loc('A')]
Out[107]: 
a    1
c    3
Name: A, Length: 2, dtype: int64

弃用面板#

Panel已弃用并将在未来版本中删除。表示 3D 数据的推荐方法是使用MultiIndex或使用DataFramexarray。 pandas 提供了一种自动执行此转换的方法(GH 13563)。to_frame()to_xarray()

In [133]: import pandas._testing as tm

In [134]: p = tm.makePanel()

In [135]: p
Out[135]:
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 3 (major_axis) x 4 (minor_axis)
Items axis: ItemA to ItemC
Major_axis axis: 2000-01-03 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D

转换为多索引数据帧

In [136]: p.to_frame()
Out[136]:
                     ItemA     ItemB     ItemC
major      minor
2000-01-03 A      0.628776 -1.409432  0.209395
           B      0.988138 -1.347533 -0.896581
           C     -0.938153  1.272395 -0.161137
           D     -0.223019 -0.591863 -1.051539
2000-01-04 A      0.186494  1.422986 -0.592886
           B     -0.072608  0.363565  1.104352
           C     -1.239072 -1.449567  0.889157
           D      2.123692 -0.414505 -0.319561
2000-01-05 A      0.952478 -2.147855 -1.473116
           B     -0.550603 -0.014752 -0.431550
           C      0.139683 -1.195524  0.288377
           D      0.122273 -1.425795 -0.619993

[12 rows x 3 columns]

转换为 xarray DataArray

In [137]: p.to_xarray()
Out[137]:
<xarray.DataArray (items: 3, major_axis: 3, minor_axis: 4)>
array([[[ 0.628776,  0.988138, -0.938153, -0.223019],
        [ 0.186494, -0.072608, -1.239072,  2.123692],
        [ 0.952478, -0.550603,  0.139683,  0.122273]],

       [[-1.409432, -1.347533,  1.272395, -0.591863],
        [ 1.422986,  0.363565, -1.449567, -0.414505],
        [-2.147855, -0.014752, -1.195524, -1.425795]],

       [[ 0.209395, -0.896581, -0.161137, -1.051539],
        [-0.592886,  1.104352,  0.889157, -0.319561],
        [-1.473116, -0.43155 ,  0.288377, -0.619993]]])
Coordinates:
  * items       (items) object 'ItemA' 'ItemB' 'ItemC'
  * major_axis  (major_axis) datetime64[ns] 2000-01-03 2000-01-04 2000-01-05
  * minor_axis  (minor_axis) object 'A' 'B' 'C' 'D'

重命名时使用字典弃用 groupby.agg() #

.groupby(..).agg(..).rolling(..).agg(..)和语法.resample(..).agg(..)可以接受输入变量,包括标量、列表以及标量或列表的列名字典。这为构造多个(可能不同的)聚合提供了有用的语法。

但是,.agg(..)可以接受允许“重命名”结果列的字典。这是一个复杂且令人困惑的语法,并且和之间也不一致。我们不赞成使用此“重命名”功能。SeriesDataFrame

  • 我们不赞成将 dict 传递给 grouped/rolled/resampled Series。这允许得到结果聚合,但这与将字典传递给接受列到聚合的rename分组具有完全不同的含义。DataFrame

  • DataFrame我们不赞成以类似的方式将字典中的字典传递给分组/滚动/重新采样。

这是一个说明性示例:

In [108]: df = pd.DataFrame({'A': [1, 1, 1, 2, 2],
   .....:                    'B': range(5),
   .....:                    'C': range(5)})
   .....: 

In [109]: df
Out[109]: 
   A  B  C
0  1  0  0
1  1  1  1
2  1  2  2
3  2  3  3
4  2  4  4

[5 rows x 3 columns]

这是计算不同列的不同聚合的典型有用语法。这是一种自然且有用的语法。我们通过获取指定的列并应用函数列表来从字典到列表进行聚合。这将返回MultiIndex列的 a (这并未被弃用)。

In [110]: df.groupby('A').agg({'B': 'sum', 'C': 'min'})
Out[110]: 
   B  C
A      
1  3  0
2  7  3

[2 rows x 2 columns]

这是第一个弃用的示例,将 dict 传递给 grouped Series。这是聚合和重命名的组合:

In [6]: df.groupby('A').B.agg({'foo': 'count'})
FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version

Out[6]:
   foo
A
1    3
2    2

您可以通过更惯用的方式完成相同的操作:

In [111]: df.groupby('A').B.agg(['count']).rename(columns={'count': 'foo'})
Out[111]: 
   foo
A     
1    3
2    2

[2 rows x 1 columns]

这是第二次弃用的示例,将 dict-of-dict 传递给 grouped DataFrame

In [23]: (df.groupby('A')
    ...:    .agg({'B': {'foo': 'sum'}, 'C': {'bar': 'min'}})
    ...:  )
FutureWarning: using a dict with renaming is deprecated and
will be removed in a future version

Out[23]:
     B   C
   foo bar
A
1   3   0
2   7   3

您可以通过以下方式完成几乎相同的任务:

In [112]: (df.groupby('A')
   .....:    .agg({'B': 'sum', 'C': 'min'})
   .....:    .rename(columns={'B': 'foo', 'C': 'bar'})
   .....:  )
   .....: 
Out[112]: 
   foo  bar
A          
1    3    0
2    7    3

[2 rows x 2 columns]

弃用 .plotting #

pandas.tools.plotting模块已被弃用,取而代之的是顶级pandas.plotting模块。所有公共绘图功能现在都可以从pandas.plotting( GH 12548 ) 获得。

此外,顶级pandas.scatter_matrixpandas.plot_params已被弃用。用户pandas.plotting也可以从中导入这些。

以前的脚本:

pd.tools.plotting.scatter_matrix(df)
pd.scatter_matrix(df)

应改为:

pd.plotting.scatter_matrix(df)

其他弃用#

  • SparseArray.to_dense()已弃用该fill参数,因为该参数未被尊重(GH 14647

  • SparseSeries.to_dense()已弃用该sparse_only参数(GH 14647

  • Series.repeat()已弃用该reps参数,转而使用repeats( GH 12662 )

  • 构造Series函数和.astype方法已弃用接受没有参数频率(例如np.datetime64)的时间戳数据类型dtypeGH 15524

  • Index.repeat()MultiIndex.repeat()已弃用该n参数,转而使用repeatsGH 12662

  • Categorical.searchsorted()Series.searchsorted()已弃用该v参数,转而使用valueGH 12662

  • TimedeltaIndex.searchsorted()DatetimeIndex.searchsorted()、 并PeriodIndex.searchsorted()已弃用该key参数,转而使用value( GH 12662 )

  • DataFrame.astype()已弃用该raise_on_error参数,转而使用errors( GH 14878 )

  • Series.sortlevelDataFrame.sortlevel已被弃用,取而代之的是Series.sort_indexDataFrame.sort_indexGH 15099

  • importing concatfrompandas.tools.merge已被弃用,取而代之的是从pandas命名空间导入。这应该只影响显式导入(GH 15358

  • Series/DataFrame/Panel.consolidate()作为公共方法已被弃用。 (GH 15483

  • 关键字as_indexerofSeries.str.match()已被弃用(忽略关键字)(GH 15257)。

  • 以下顶级 pandas 函数已被弃用,并将在未来版本中删除(GH 13790GH 15940

    • pd.pnow(), 取而代之Period.now()

    • pd.Term,已删除,因为它不适用于用户代码。在 HDFStore 中搜索时,请改为在 where 子句中使用内联字符串表达式

    • pd.Expr,已删除,因为它不适用于用户代码。

    • pd.match(), 已移除。

    • pd.groupby(),替换为.groupby()直接在 a 上使用该方法Series/DataFrame

    • pd.get_store(),替换为直接调用pd.HDFStore(...)

  • is_any_int_dtypeis_floating_dtype、 和is_sequence已从pandas.api.types( GH 16042 )弃用

删除先前版本的弃用/更改#

  • pandas.rpy模块已被移除。可以通过rpy2项目访问类似的功能。有关更多详细信息,请参阅R 接口文档。

  • pandas.io.ga带接口的模块被google-analytics移除(GH 11308)。类似的功能可以在Google2Pandas包中找到。

  • pd.to_datetimepd.to_timedelta删除了coerce有利于errorsGH 13602)的参数

  • pandas.stats.fama_macbethpandas.stats.olspandas.stats.plmpandas.stats.var以及顶级例程pandas.fama_macbethpandas.ols例程均被删除。类似的功能可以在statsmodels包中找到。 (GH 11898

  • TimeSeries和类SparseTimeSeriesSeries 和的别名SparseSeries被删除(GH 10890GH 15098)。

  • Series.is_time_series被放弃,取而代之的是Series.index.is_all_datesGH 15098

  • 已弃用的irowicol和方法已被删除igetiget_value以支持 和iloc,如此iat所述(GH 10711)。

  • 已弃用的内容DataFrame.iterkv()已被删除,取而代之的是DataFrame.iteritems()GH 10711

  • 构造Categorical函数已删除name参数(GH 10632

  • Categorical已放弃对NaN类别的支持(GH 10748

  • take_last参数已从duplicated()drop_duplicates()nlargest()nsmallest()方法中删除(GH 10236GH 10792GH 10920

  • SeriesIndex、 并DataFrame删除了sortorder方法(GH 10726

  • 其中的子句pytables仅被接受为字符串和表达式类型,而不被接受为其他数据类型(GH 12027

  • DataFrame已经放弃了combineAddcombineMult方法,分别支持addmulGH 10735

性能改进#

  • 改进的性能pd.wide_to_long()( GH 14779 )

  • 当推断为字符串时,pd.factorize()通过释放带有 dtype 的 GIL 来提高性能( GH 14859GH 16057object

  • 改进了使用不规则 DatetimeIndex (或使用compat_x=True)绘制时间序列的性能 ( GH 15073 )。

  • groupby().cummin()改进了和的性能groupby().cummax()GH 15048GH 15109GH 15561GH 15635

  • 使用MultiIndex( GH 15245 )建立索引时提高了性能并减少了内存

  • 当在没有指定格式的方法中读取缓冲区对象时read_sas(),将推断文件路径字符串而不是缓冲区对象。 (GH 14947

  • .rank()改进了分类数据的性能( GH 15498

  • 使用时提高了性能.unstack()GH 15503

  • 改进了列合并/连接的性能categoryGH 10409

  • drop_duplicates()改进了柱上的性能boolGH 12963

  • 提高pd.core.groupby.GroupBy.apply应用函数使用.name组 DataFrame ( GH 15062 ) 的属性时的性能。

  • iloc改进了列表或数组索引的性能( GH 15504)。

  • Series.sort_index()改进了单调索引的性能( GH 15694

  • 提高了某些具有缓冲读取的平台上的性能pd.read_csv()GH 16039

Bug修复

转换

  • 现在,当给出不正确的参数名称时,Timestamp.replace会出现错误;TypeError之前提出过这个问题ValueErrorGH 15240

  • Timestamp.replace传递长整数时存在 compat 错误( GH 15030

  • Timestamp提供时区时返回基于 UTC 的时间/日期属性的错误( GH 13303GH 6538

  • 施工期间错误本地化时区的错误TimestampGH 11481GH 15777

  • TimedeltaIndex另外,允许溢出且没有错误的错误( GH 14816

  • 使用( GH 14946 )TimedeltaIndex引发ValueErrorwhen 布尔索引时出现错误loc

  • Timestamp在+操作中捕获溢出的错误Timedelta/OffsetGH 15126

  • 以毫秒或更短的时间舍入时出现错误DatetimeIndex.round()Timestamp.round()浮点精度(GH 14440GH 15578

  • astype()值被错误地inf转换为整数的错误。现在,astype()Series 和 DataFrames 会引发错误(GH 14265

  • DataFrame(..).apply(to_numeric)当值的类型为decimal.Decimal时出现错误。 (GH 14827

  • describe()将不包含中位数的 numpy 数组传递给关键字参数时出现错误percentilesGH 14908

  • 清理PeriodIndex构造函数,包括更一致地在浮点数上加注(GH 13277

  • __deepcopy__在空 NDFrame 对象上使用时出现错误( GH 15370

  • 错误.replace()可能会导致不正确的数据类型。 (GH 12747GH 15765

  • 错误Series.replace并且DataFrame.replace在空替换字典上失败(GH 15289

  • Series.replace用字符串替换数字的错误( GH 15743

  • Index指定元素和整数数据类型的构造错误NaNGH 15187

  • Seriesdatetimetz 构造中的错误( GH 14928

  • 具有不同参数的Series.dt.round()行为不一致的错误( GH 14940NaT

  • Series当同时提供copy=True和参数时,构造函数中存在错误( GH 15125dtype

  • 比较方法(例如,,,...)针对空常量(GH 15077Series返回了不正确的数据类型ltgtDataFrame

  • Series.ffill()包含 tz 感知日期时间的混合数据类型存在错误。 (GH 14956

  • 当 fillna 值是类型时DataFrame.fillna()参数被忽略的错误(GH 15277downcastdict

  • 错误.asfreq(),其中频率未设置为空SeriesGH 14320

  • DataFrame类似列表中的空值和日期时间构造错误( GH 15869

  • Bug in DataFrame.fillna()with tz-aware datetime ( GH 15855 )

  • is_string_dtype、和 中的错误is_timedelta64_ns_dtype,其中在传入is_string_like_dtype时引发错误( GH 15941None

  • pd.uniquea的返回类型中的错误Categorical,它返回 ndarray 而不是 a Categorical( GH 15903 )

  • Index.to_series()未复制索引的位置存在错误(因此稍后的变异会更改原始索引),( GH 15949

  • 使用 len-1 DataFrame 进行部分字符串索引的索引中的错误(GH 16071

  • 构造中的错误Series,传递无效的数据类型不会引发错误。 (GH 15520

索引#

  • Index具有反向操作数的幂运算中的错误( GH 14973

  • 按多列排序时出现错误DataFrame.sort_values(),其中一列属于类型int64并包含NaT( GH 14922 )

  • DataFrame.reindex()通过method时被忽略的错误columnsGH 14992

  • 使用索引器对DataFrame.loca 进行索引时出现错误(GH 14730GH 15424MultiIndexSeries

  • 使用 numpy 数组DataFrame.loc索引 a 时出现错误( GH 15434MultiIndex

  • Series.asof如果该系列包含全部内容,则会引发错误np.nanGH 15713

  • .at从 tz 感知列中进行选择时出现错误( GH 15822 )

  • Series.where()类似数组DataFrame.where()的条件被拒绝的错误( GH 15414

  • Series.where()TZ 感知数据转换为浮点表示的错误( GH 15701

  • 错误在于.loc不会返回正确的数据类型以进行数据帧的标量访问(GH 11617

  • 当名称为整数时a 的输出格式存在错误MultiIndexGH 12223GH 15262

  • Categorical.searchsorted()使用字母顺序而不是提供的分类顺序的错误( GH 14522

  • 返回类列表索引输入的对象(预期为 a)Series.iloc的错误。(GH 14580CategoricalSeries

  • DataFrame.isin将datetimelike 与空帧进行比较时出现错误( GH 15473

  • .reset_index()当所有NaN级别的 aMultiIndex都会失败时出现错误( GH 6322

  • .reset_index()当列中已存在的索引名称引发错误时出现错误MultiIndexGH 16120

  • 创建MultiIndex元组而不传递名称列表时出现错误;现在将提高ValueErrorGH 15110

  • HTML 显示中带有 aMultiIndex和 截断的错误 ( GH 14882 )

  • 显示中的错误:.info()限定符 (+) 始终与MultiIndex仅包含非字符串的 a 一起显示 ( GH 15245 )

  • 当输入名称中出现结果名称时,无法正确处理结果pd.concat()名称的错误(GH 15787MultiIndexDataFrameNoneMultiIndexDataFrame

  • 错误DataFrame.sort_index()以及Series.sort_index()不适na_position用于MultiIndexGH 14784GH 16604

  • pd.concat()将对象与CategoricalIndex( GH 16111 )组合时出现错误

  • 使用标量和 a 进行索引时出现错误CategoricalIndex( GH 16123 )

IO #

  • pd.to_numeric()浮点和无符号整数元素被错误转换的错误( GH 14941GH 15005

  • pd.read_fwf()在列宽推断期间不遵守skiprows参数的错误( GH 11256

  • 处理前未验证参数pd.read_csv()的错误( GH 14898dialect

  • pd.read_csv()错误处理丢失的数据(usecolsGH 6710

  • pd.read_csv()包含多列行和较少列行的文件会导致崩溃的错误( GH 14125 )

  • pd.read_csv()C 引擎的错误,usecols索引错误parse_datesGH 14792

  • pd.read_csv()指定parse_dates多行标题时出现错误( GH 15376

  • 解析文本条目时导致段错误的错误pd.read_csv()(GH 15140float_precision='round_trip'

  • pd.read_csv()指定索引且未将任何值指定为空值时出现错误( GH 15835

  • pd.read_csv()某些无效文件对象导致 Python 解释器崩溃的错误( GH 15337 )

  • 允许和 的pd.read_csv()无效值的错误( GH 15767nrowschunksize

  • pd.read_csv()Python 引擎的错误,在发生解析错误时会引发无用的错误消息( GH 15910

  • 未正确验证参数pd.read_csv()的错误( GH 15925 )skipfooter

  • pd.to_csv()写入时间戳索引时出现数字溢出的错误( GH 15982 )

  • 错误在于pd.util.hashing.hash_pandas_object(),分类的哈希值取决于类别的顺序,而不仅仅是它们的值。 (GH 15143

  • .to_json()位置lines=True和内容(键或值)包含转义字符的错误( GH 15096

  • .to_json()导致单字节 ascii 字符扩展为四字节 unicode 的错误( GH 15344 )

  • C 引擎存在错误.to_json(),在 frac 为奇数且 diff 恰好为 0.5 的情况下,无法正确处理翻转(GH 15716GH 15864

  • pd.read_json()Python 2 中的错误,其中lines=True和 内容包含非 ascii unicode 字符 ( GH 15132 )

  • pd.read_msgpack()分类Series处理不当的错误( GH 14901

  • pd.read_msgpack()不允许加载具有类型索引的数据帧的错误CategoricalIndexGH 15487

  • pd.read_msgpack()反序列化时出现错误CategoricalIndexGH 15487

  • DataFrame.to_records()转换DatetimeIndex时区时出现错误( GH 13937

  • DataFrame.to_records()列名称中的 unicode 字符失败的错误( GH 11879 )

  • 使用数字索引名称( GH 15404.to_sql() )编写 DataFrame 时出现错误。

  • 错误地加入DataFrame.to_html()index=False提出max_rowsIndexErrorGH 14998

  • pd.read_hdf()将 a 传递Timestampwhere具有非日期列的参数时出现错误( GH 15492

  • 错误DataFrame.to_stata()StataWriter它会为某些语言环境生成格式不正确的文件(GH 13856

  • 错误StataReaderStataWriter允许无效编码(GH 15723

  • Series当输出被截断时,repr中的错误不显示长度( GH 15962)。

绘图#

  • 错误在DataFrame.hist哪里plt.tight_layout导致AttributeError(使用)(GH 9351matplotlib >= 2.0.1

  • 错误在DataFrame.boxplot哪里fontsize没有应用于两个轴上的刻度标签(GH 15108

  • pandas 使用 matplotlib 注册的日期和时间转换器中的错误不处理多个维度(GH 16026

  • 错误pd.scatter_matrix()可以接受或colorc但不能同时接受两者(GH 14855

GroupBy/重新采样/滚动#

  • .groupby(..).resample()当经过kwarg 时出现错误on=。 (GH 15021

  • 正确设置__name____qualname__功能Groupby.*GH 14620

  • GroupBy.get_group()分类石斑鱼失败的错误( GH 15155

  • 指定并使用( GH 15130GH 13966 ).groupby(...).rolling(...)时出现错误onDatetimeIndex

  • timedelta64传递时的 groupby 操作中的错误numeric_only=FalseGH 5724

  • groupby.apply()当并非所有值都是数字时,将 dtypes强制转换object为数字类型时出现错误( GH 14423GH 15421GH 15670

  • 中的错误,在重新采样时间序列时不会应用resample非字符串参数( GH 13218loffset

  • DataFrame.groupby().describe()对包含元组进行分组时出现错误IndexGH 14848

  • groupby().nunique()使用 datetimelike-grouper 时出现错误,其中 bin 计数不正确( GH 13453

  • 错误groupby.transform()会强制生成的数据类型回到原始(GH 10972GH 11444

  • 错误groupby.agg()本地化时区datetimeGH 15426GH 10668GH 13046

  • .rolling/expanding()函数中的错误count()不计数np.Inf,也不处理object数据类型(GH 12541

  • 错误在.rolling()哪里pd.Timedeltadatetime.timedelta不被接受作为window参数(GH 15440

  • Rolling.quantile使用超出范围 [0, 1] 的分位数值调用时导致分段错误的函数错误( GH 15463 )

  • DataFrame.resample().median()如果存在重复的列名称,则会出现错误( GH 14233

稀疏#

  • SparseSeries.reindex长度为 1 的列表中的单级错误( GH 15447 )

  • SparseDataFrame在其系列之一(的副本)上设置值后重新格式化 a 时出现错误( GH 15488

  • SparseDataFrame列表构造中的错误不强制为 dtype ( GH 15682 )

  • 稀疏数组索引中的错误,其中未验证索引(GH 15863

重塑#

  • 指定多个时pd.merge_asof()出现错误left_indexright_index导致失败( GH 15676by

  • 指定pd.merge_asof()left_index/right_index一起导致失败的错误( GH 15135 )tolerance

  • DataFrame.pivot_table()当列是 dtype 时, where中的错误dropna=True不会删除所有 NaN 列categoryGH 15193

  • pd.melt()传递元组值导致的value_vars错误(TypeErrorGH 15348

  • pd.pivot_table()当值参数不在列中时没有引发错误的错误( GH 14938

  • pd.concat()与空数据帧连接join='inner'处理不当的错误( GH 15328

  • sort=True在加入索引时DataFrame.joinpd.merge加入索引时出现错误( GH 15582

  • DataFrame.nsmallest相同值导致DataFrame.nlargest重复行的错误( GH 15297 )

  • 传递关键字的 unicode 输入时pandas.pivot_table()错误引发的错误( GH 13292 )UnicodeErrormargins

数字#

  • .rank()错误排列有序类别的错误( GH 15420 )

  • 列和索引是同一对象的.corr()错误(GH 14617.cov()

  • 如果只有一个值则不返回的.mode()错误(GH 15714mode

  • pd.cut()全 0 数组上的单个 bin存在错误( GH 15428

  • pd.qcut()单个分位数和具有相同值的数组存在错误( GH 15431

  • 大输入的错误pandas.tools.utils.cartesian_product()可能会导致 Windows 溢出(GH 15265

  • .eval()导致多行评估失败且局部变量不在第一行的错误( GH 15342

其他

  • 与 SciPy 0.19.0 兼容以进行测试.interpolate()GH 15662

  • 兼容 32 位平台.qcut/cut; bin 现在将是int64dtype ( GH 14866 )

  • Qt当 a已经存在时交互中的错误QtApplication( GH 14372 )

  • 避免使用np.finfo()excepted来缓解 Python GIL 误用造成的死锁 ( GH 14641 )import pandas

贡献者#

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

  • 亚当·J·斯图尔特 +

  • 阿德里安+

  • 阿杰·萨克塞纳

  • Akka什·坦登 +

  • 阿尔伯特·维拉诺瓦·德尔·莫拉尔 +

  • 阿列克谢·比洛古尔 +

  • 亚历克西斯·米尼翁 +

  • 阿莫尔·卡哈特 +

  • 安德烈亚斯·温克勒 +

  • 安德鲁·基特里奇 +

  • 安东尼奥·帕特尼奥

  • 阿科·巴斯特 +

  • 阿什什·辛格尔 +

  • 鲍尔赞·穆夫塔希季诺夫 +

  • 本·坎德尔

  • 本·塞耶 +

  • 本·威尔士 +

  • 比尔·钱伯斯 +

  • 布兰登·M·巴勒斯

  • 布莱恩+

  • 布莱恩·麦克菲 +

  • 卡洛斯·苏萨 +

  • 克里斯

  • 克里斯·汉姆

  • 克里斯·沃斯

  • 克里斯托夫·戈尔克

  • 克里斯托夫·保利克 +

  • 克里斯托弗·艾科克

  • 克莱门斯·布伦纳 +

  • DS麦克尼尔+

  • 达安·范豪维尔梅伦 +

  • 丹尼尔·希梅尔斯坦

  • 戴夫·威尔默

  • 大卫·库克 +

  • 大卫·格温 +

  • 大卫·霍夫曼 +

  • 大卫·克里奇

  • 迭戈·费尔南德斯 +

  • 季米特里斯·斯帕西斯 +

  • 德米特里·L+

  • 多迪·苏里亚·维贾亚 +

  • 多米尼克·斯坦扎克 +

  • 欧文博士

  • 欧文博士+

  • 埃利奥特·萨莱斯·安德拉德 +

  • 仇敌克里斯托夫 +

  • 弗朗西斯科·阿尔特 +

  • 滨村文人 +

  • 贾科莫·费罗尼

  • 格雷厄姆·R·杰弗里斯 +

  • 格雷格·威廉姆斯 +

  • 吉列尔梅·贝尔特拉米尼 +

  • 吉列尔梅·萨莫拉 +

  • 吴浩+

  • 哈希特·帕特尼 +

  • 伊利亚·V·舒罗夫 +

  • 伊万·瓦莱斯·佩雷斯

  • 冷杰基 +

  • 黄在勋 +

  • 詹姆斯·德雷珀 +

  • 詹姆斯·戈珀特 +

  • 詹姆斯·麦克布莱德 +

  • 詹姆斯·桑图奇 +

  • 扬·舒尔茨

  • 杰夫·凯里

  • 杰夫·雷巴克

  • 珍娜·维吉斯特 +

  • 吉姆+

  • 吉姆·克里斯特

  • 乔·杰夫尼克

  • 乔尔·诺斯曼 +

  • 约翰+

  • 约翰·塔克 +

  • 约翰·W·奥布莱恩

  • 约翰·茨温克

  • 乔恩·米斯

  • 乔恩·米斯

  • 乔纳森·惠特莫尔 +

  • 乔纳森·德·布鲁因 +

  • 乔斯特·克拉南东克 +

  • 乔里斯·范登博什

  • 约书亚·布拉特 +

  • 朱利安桑坦德

  • 朱利安·马雷克 +

  • 金俊+

  • 贾斯汀·索林斯基 +

  • 卡卡维+

  • 卡迈勒·卡玛拉丁 +

  • 克比谢登

  • 克恩克

  • 凯沙夫·拉马斯瓦米

  • 凯文·谢泼德

  • 凯尔·凯利

  • 拉里·任

  • 尹立昂+

  • 佩德森线 +

  • 洛伦佐·塞斯塔罗 +

  • 卢卡·Scala贝洛

  • 卢卡斯+

  • 马哈茂德·拉巴比迪

  • 马克·曼德尔 +

  • 马特·罗斯克

  • 马修·布雷特

  • 马修·罗斯克 +

  • 马蒂·皮库斯

  • 马克西米利安·鲁斯

  • 迈克尔·查尔顿 +

  • 迈克尔·费尔特

  • 迈克尔·兰帕尔斯基 +

  • 米歇尔·斯托克 +

  • 米科拉伊·查瓦利斯 +

  • 敏瑞克

  • 米罗斯拉夫·塞迪维 +

  • 米科拉·戈卢比耶夫

  • 内特·约德

  • 纳塔莉·鲁德+

  • 尼古拉斯·维尔·海伦

  • 尼克·奇穆拉 +

  • 诺兰·尼科尔斯 +

  • 潘卡·潘迪 +

  • 帕维尔·科德克

  • 黄皮特 +

  • 彼得+

  • 彼得·奇塞克 +

  • 佩蒂奥·彼得罗夫 +

  • 菲尔·拉夫温德 +

  • 彼得罗·巴蒂斯顿

  • 彼得·克罗米克

  • 普拉桑吉特·普拉卡什 +

  • 罗布·福尔吉奥内 +

  • 罗伯特·布拉德肖

  • 罗宾+

  • 鲁道夫·费尔南德斯

  • 罗杰·托马斯

  • 鲁兹·阿扎里 +

  • 萨希尔·杜阿

  • 符山姆 +

  • 萨米·萨洛宁 +

  • 莎拉·伯德 +

  • 萨尔玛·坦吉拉拉 +

  • 斯科特·桑德森

  • 塞巴斯蒂安银行

  • 塞巴斯蒂安·格桑格 +

  • 肖恩·海德

  • 希亚姆·萨拉迪 +

  • 辛赫克斯

  • 斯蒂芬·劳奇 +

  • 塞巴斯蒂安·德·门滕 +

  • 塔拉·阿迪斯尚

  • 蒂亚戈·塞拉菲姆

  • 索拉尔夫·古铁雷斯 +

  • 特拉西布勒 +

  • 托比亚斯·古斯塔夫森 +

  • 汤姆·奥格斯普格

  • 沉童+

  • 通申+

  • TrigonaMinima +

  • 乌韦+

  • 韦斯·特纳

  • 维克托·汤姆恰克 +

  • 威尔·艾德

  • 雅罗斯拉夫·哈尔琴科

  • 张亦萌 +

  • 阿巴尔登科 +

  • 阿德里安·斯特皮恩 +

  • 亚历山大·布斯 +

  • atbd+

  • 巴斯特瓦特 +

  • 布马格努森+

  • 卡洛斯丹尼尔桑托斯 +

  • 柴姆脱模机 +

  • 克里斯-B1

  • 迪克路透 +

  • 不和谐+

  • 狮子座博士+

  • 杜堡

  • 德威克尼菲克 +

  • 有趣的螃蟹+

  • 格菲扬

  • 金牛+

  • hesham.shabana@hotmail.com

  • 乔乔姆+

  • 线bp +

  • 马努+

  • 手册+

  • 马蒂普+

  • 麦克斯阿尔伯特+

  • 麦科达+

  • 努夫+

  • 保罗·曼尼诺

  • 泄露 +

  • 萨克莫+

  • scls19fr

  • 辛赫克斯

  • 斯蒂恩万霍伊 +

  • 鼻子知道+

  • 最大热值 +

  • 汤姆罗德+

  • 辛克格拉夫

  • 旺森费雷拉

  • 水渡+

  • 瓦格纳

  • xgdgsc+

  • yui-knk