版本 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而不是Panel,Panel现在已弃用,请参阅此处 现在使用对 S3 处理的支持s3fs,请参阅此处 Google BigQuery 支持现在使用该pandas-gbq库,请参阅此处 警告 pandas 改变了代码库的内部结构和布局。这可能会影响不是来自顶级命名空间的导入,请参阅此处的pandas.*更改。 更新前请检查API 更改和弃用。 笔记 这是 0.20.0 和 0.20.1 的组合版本。版本 0.20.1 包含一项额外的更改,以实现与使用 pandas 例程的下游项目的向后兼容性utils。 (GH 16250) v0.20.0 中的新增内容 新功能 aggDataFrame/Series 的方法API dtype数据 IO 的关键字参数 方法.to_datetime()获得了一个origin参数 分组依据增强功能 更好地支持压缩 URLread_csv Pickle 文件 IO 现在支持压缩 改进了 UInt64 支持 分类上的 GroupBy 表模式输出 SciPy 稀疏矩阵从/到 SparseDataFrame 样式化 DataFrame 的 Excel 输出 区间索引 其他增强功能 向后不兼容的 API 更改 使用 pandas < 0.13.0 创建的 HDF5 格式可能不兼容 索引类型上的映射现在返回其他索引类型 访问索引的日期时间字段现在返回索引 pd.unique 现在将与扩展类型一致 S3 文件处理 部分字符串索引更改 不同浮点数据类型的连接不会自动向上转换 pandas Google BigQuery 支持已转移 Index的内存使用情况更准确 DataFrame.sort_index 更改 GroupBy 描述格式 窗口二进制 corr/cov 操作返回 MultiIndex DataFrame HDFStore where 字符串比较 Index.intersection 和内部连接现在保留左侧索引的顺序 数据透视表始终返回 DataFrame 其他 API 更改 图书馆重组:隐私变化 模块隐私已更改 pandas.errors pandas.testing pandas.plotting 其他发展变化 弃用 弃用.ix 弃用面板 重命名时使用字典弃用 groupby.agg() 弃用 .plotting 其他弃用 删除先前版本的弃用/更改 性能改进 Bug修复 转换 索引 IO 绘图 分组/重采样/滚动 疏 重塑 数字 其他 贡献者 新功能# 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 11276,GH 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()现在支持其他压缩方法:xz、bz2和zip( 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 4471、GH 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') 有关更多详细信息,请参阅样式文档。 间隔索引# pandas 获得了IntervalIndex自己的 dtypeinterval以及Interval标量类型。这些允许对区间表示法的一流支持,特别是作为cut()和中类别的返回类型qcut()。允许IntervalIndex一些唯一的索引,请参阅 文档。 (GH 7640,GH 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.sub(GH 15055) Series.str.replace()现在接受已编译的正则表达式作为模式(GH 15446) Series.sort_index接受参数kind和na_position(GH 13589,GH 14444) DataFrame并DataFrame.groupby()获得了一种nunique()计算轴上不同值的方法(GH 14336,GH 15197)。 DataFrame已经获得了一种melt()方法,相当于pd.melt(),用于从宽格式转为长格式(GH 12640)。 pd.read_excel()现在使用时保留图纸顺序sheetname=None(GH 9930) 现在支持带小数点的多个偏移别名(例如0.5min解析为30s)(GH 8419) .isnull()并.notnull()已添加到Index对象中以使它们与SeriesAPI 更加一致(GH 15300) 当索引/切片到未排序的 MultiIndex ( GH 11897 ) 时引发新的UnsortedIndexError( 的子类) 。这允许区分由于缺乏排序或不正确的键而导致的错误。看这里KeyError MultiIndex已经获得了.to_frame()转换为DataFrame(GH 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和参数chunksize(GH 6774,GH 15755)pd.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 的能力MultiIndex(GH 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和 的楼层划分TimedeltaIndex(GH 15828) pandas.io.json.json_normalize()获得了选择权errors='ignore'|'raise';默认值是errors='raise'向后兼容的。 (GH 14583) pandas.io.json.json_normalize()为空list将返回空DataFrame(GH 15534) pandas.io.json.json_normalize()获得了接受分隔连接字段sep的选项;str默认为“.”,向后兼容。 (GH 14883) MultiIndex.remove_unused_levels()已添加以方便删除未使用的级别。 (GH 15694) pd.read_csv()ParserError现在,每当发生任何解析错误时都会引发错误( GH 15913,GH 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 14757)color=[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') map在Series带有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 15022)DatetimeIndexPeriodIndexTimedeltaIndexIndex 以前的行为: 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 结构上显示时,仅包含实际索引值,而不包含有助于快速索引的结构。对于其他索引类型,这通常会有所不同Index。MultiIndex(GH 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 15622、GH 15687、GH 14015、GH 13431、GH 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 15677)MultiIndexed 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 通常会导致无效比较,返回空结果帧。这些比较现在将提出 TypeError(GH 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.join和pd.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 4386)Series 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()将始终分别返回SparseArray和SparseSeries( GH 12855 ) DataFrame.applymap()带有空的DataFrame将返回空的副本DataFrame而不是Series(GH 8222) Series.map()现在使用方法尊重字典子类的默认值__missing__,例如collections.Counter(GH 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 15118)NaN 对 NDFrame 对象的特定支持copy.copy()和功能( GH 15444)copy.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_start(GH 15781) NaT现在将正确返回np.nanandTimedelta访问Period器,例如daysand quarter( GH 15782 ) NaT现在将返回NaT和tz_localize方法tz_convert (GH 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.core、pandas.compat和pandas.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.errors、pandas.plotting和 pandas.testing(更多详细信息如下)。与和子模块pandas.api.types中的某些功能一起,这些现在是公共子包。pandas.iopandas.tseries 进一步的变化: 现在可以从( GH 15998 )union_categoricals()导入该函数pandas.api.typespandas.types.concat 类型导入已弃用,可以使用(GH 16146)pandas.tslib.NaTType替换type(pandas.NaT) 公共函数已从pandas.tools.hashing该位置弃用,但现在可以从pandas.util(GH 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 的一部分: testing.assert_frame_equal() testing.assert_series_equal() testing.assert_index_equal() pandas.plotting# pandas.plotting添加了一个新的公共模块,该模块包含以前pandas.tools.plotting位于顶级命名空间中的绘图功能。有关更多详细信息,请参阅弃用部分。 其他开发变化# 现在需要构建熊猫以进行开发(GH 14831)cython >= 0.23 需要至少 0.23 版本的 cython 以避免字符编码问题(GH 14699) 将测试框架切换为使用pytest ( GH 13097 ) 重组测试目录布局(GH 14854,GH 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_matrix和pandas.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)的时间戳数据类型dtype(GH 15524) Index.repeat()并MultiIndex.repeat()已弃用该n参数,转而使用repeats(GH 12662) Categorical.searchsorted()并Series.searchsorted()已弃用该v参数,转而使用value(GH 12662) TimedeltaIndex.searchsorted()、DatetimeIndex.searchsorted()、 并PeriodIndex.searchsorted()已弃用该key参数,转而使用value( GH 12662 ) DataFrame.astype()已弃用该raise_on_error参数,转而使用errors( GH 14878 ) Series.sortlevel并DataFrame.sortlevel已被弃用,取而代之的是Series.sort_index和DataFrame.sort_index(GH 15099) importing concatfrompandas.tools.merge已被弃用,取而代之的是从pandas命名空间导入。这应该只影响显式导入(GH 15358) Series/DataFrame/Panel.consolidate()作为公共方法已被弃用。 (GH 15483) 关键字as_indexerofSeries.str.match()已被弃用(忽略关键字)(GH 15257)。 以下顶级 pandas 函数已被弃用,并将在未来版本中删除(GH 13790、GH 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_dtype、is_floating_dtype、 和is_sequence已从pandas.api.types( GH 16042 )弃用 删除先前版本的弃用/更改# 该pandas.rpy模块已被移除。可以通过rpy2项目访问类似的功能。有关更多详细信息,请参阅R 接口文档。 pandas.io.ga带接口的模块被google-analytics移除(GH 11308)。类似的功能可以在Google2Pandas包中找到。 pd.to_datetime并pd.to_timedelta删除了coerce有利于errors(GH 13602)的参数 pandas.stats.fama_macbeth、pandas.stats.ols、pandas.stats.plm和pandas.stats.var以及顶级例程pandas.fama_macbeth和pandas.ols例程均被删除。类似的功能可以在statsmodels包中找到。 (GH 11898) TimeSeries和类SparseTimeSeries、Series 和的别名SparseSeries被删除(GH 10890、GH 15098)。 Series.is_time_series被放弃,取而代之的是Series.index.is_all_dates(GH 15098) 已弃用的irow、icol和方法已被删除iget,iget_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 10236、GH 10792、GH 10920) Series、Index、 并DataFrame删除了sort和order方法(GH 10726) 其中的子句pytables仅被接受为字符串和表达式类型,而不被接受为其他数据类型(GH 12027) DataFrame已经放弃了combineAdd和combineMult方法,分别支持add和mul(GH 10735) 性能改进# 改进的性能pd.wide_to_long()( GH 14779 ) 当推断为字符串时,pd.factorize()通过释放带有 dtype 的 GIL 来提高性能( GH 14859、GH 16057)object 改进了使用不规则 DatetimeIndex (或使用compat_x=True)绘制时间序列的性能 ( GH 15073 )。 groupby().cummin()改进了和的性能groupby().cummax()(GH 15048、GH 15109、GH 15561、GH 15635) 使用MultiIndex( GH 15245 )建立索引时提高了性能并减少了内存 当在没有指定格式的方法中读取缓冲区对象时read_sas(),将推断文件路径字符串而不是缓冲区对象。 (GH 14947) .rank()改进了分类数据的性能( GH 15498) 使用时提高了性能.unstack()(GH 15503) 改进了列合并/连接的性能category(GH 10409) drop_duplicates()改进了柱上的性能bool(GH 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之前提出过这个问题ValueError(GH 15240) Timestamp.replace传递长整数时存在 compat 错误( GH 15030) Timestamp提供时区时返回基于 UTC 的时间/日期属性的错误( GH 13303、GH 6538) 施工期间错误本地化时区的错误Timestamp(GH 11481,GH 15777) TimedeltaIndex另外,允许溢出且没有错误的错误( GH 14816) 使用( GH 14946 )TimedeltaIndex引发ValueErrorwhen 布尔索引时出现错误loc Timestamp在+操作中捕获溢出的错误Timedelta/Offset(GH 15126) 以毫秒或更短的时间舍入时出现错误DatetimeIndex.round()和Timestamp.round()浮点精度(GH 14440、GH 15578) astype()值被错误地inf转换为整数的错误。现在,astype()Series 和 DataFrames 会引发错误(GH 14265) DataFrame(..).apply(to_numeric)当值的类型为decimal.Decimal时出现错误。 (GH 14827) describe()将不包含中位数的 numpy 数组传递给关键字参数时出现错误percentiles(GH 14908) 清理PeriodIndex构造函数,包括更一致地在浮点数上加注(GH 13277) __deepcopy__在空 NDFrame 对象上使用时出现错误( GH 15370) 错误.replace()可能会导致不正确的数据类型。 (GH 12747,GH 15765) 错误Series.replace并且DataFrame.replace在空替换字典上失败(GH 15289) Series.replace用字符串替换数字的错误( GH 15743) Index指定元素和整数数据类型的构造错误NaN(GH 15187) Seriesdatetimetz 构造中的错误( GH 14928) 具有不同参数的Series.dt.round()行为不一致的错误( GH 14940)NaT Series当同时提供copy=True和参数时,构造函数中存在错误( GH 15125)dtype 比较方法(例如,,,...)针对空常量(GH 15077)Series返回了不正确的数据类型ltgtDataFrame Series.ffill()包含 tz 感知日期时间的混合数据类型存在错误。 (GH 14956) 当 fillna 值是类型时DataFrame.fillna()参数被忽略的错误(GH 15277)downcastdict 错误.asfreq(),其中频率未设置为空Series(GH 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 15941)None 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时被忽略的错误columns(GH 14992) 使用索引器对DataFrame.loca 进行索引时出现错误(GH 14730、GH 15424)MultiIndexSeries 使用 numpy 数组DataFrame.loc索引 a 时出现错误( GH 15434)MultiIndex Series.asof如果该系列包含全部内容,则会引发错误np.nan(GH 15713) .at从 tz 感知列中进行选择时出现错误( GH 15822 ) Series.where()类似数组DataFrame.where()的条件被拒绝的错误( GH 15414) Series.where()TZ 感知数据转换为浮点表示的错误( GH 15701) 错误在于.loc不会返回正确的数据类型以进行数据帧的标量访问(GH 11617) 当名称为整数时a 的输出格式存在错误MultiIndex(GH 12223、GH 15262) Categorical.searchsorted()使用字母顺序而不是提供的分类顺序的错误( GH 14522) 返回类列表索引输入的对象(预期为 a)Series.iloc的错误。(GH 14580)CategoricalSeries DataFrame.isin将datetimelike 与空帧进行比较时出现错误( GH 15473) .reset_index()当所有NaN级别的 aMultiIndex都会失败时出现错误( GH 6322) .reset_index()当列中已存在的索引名称引发错误时出现错误MultiIndex(GH 16120) 创建MultiIndex元组而不传递名称列表时出现错误;现在将提高ValueError(GH 15110) HTML 显示中带有 aMultiIndex和 截断的错误 ( GH 14882 ) 显示中的错误:.info()限定符 (+) 始终与MultiIndex仅包含非字符串的 a 一起显示 ( GH 15245 ) 当输入名称中出现结果名称时,无法正确处理结果pd.concat()名称的错误(GH 15787)MultiIndexDataFrameNoneMultiIndexDataFrame 错误DataFrame.sort_index()以及Series.sort_index()不适na_position用于MultiIndex(GH 14784,GH 16604) pd.concat()将对象与CategoricalIndex( GH 16111 )组合时出现错误 使用标量和 a 进行索引时出现错误CategoricalIndex( GH 16123 ) IO # pd.to_numeric()浮点和无符号整数元素被错误转换的错误( GH 14941,GH 15005) pd.read_fwf()在列宽推断期间不遵守skiprows参数的错误( GH 11256) 处理前未验证参数pd.read_csv()的错误( GH 14898)dialect pd.read_csv()错误处理丢失的数据(usecolsGH 6710) pd.read_csv()包含多列行和较少列行的文件会导致崩溃的错误( GH 14125 ) pd.read_csv()C 引擎的错误,usecols索引错误parse_dates(GH 14792) pd.read_csv()指定parse_dates多行标题时出现错误( GH 15376) 解析文本条目时导致段错误的错误pd.read_csv()(GH 15140)float_precision='round_trip' pd.read_csv()指定索引且未将任何值指定为空值时出现错误( GH 15835) pd.read_csv()某些无效文件对象导致 Python 解释器崩溃的错误( GH 15337 ) 允许和 的pd.read_csv()无效值的错误( GH 15767)nrowschunksize 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 15716、GH 15864) pd.read_json()Python 2 中的错误,其中lines=True和 内容包含非 ascii unicode 字符 ( GH 15132 ) pd.read_msgpack()分类Series处理不当的错误( GH 14901) pd.read_msgpack()不允许加载具有类型索引的数据帧的错误CategoricalIndex(GH 15487) pd.read_msgpack()反序列化时出现错误CategoricalIndex(GH 15487) DataFrame.to_records()转换DatetimeIndex时区时出现错误( GH 13937) DataFrame.to_records()列名称中的 unicode 字符失败的错误( GH 11879 ) 使用数字索引名称( GH 15404.to_sql() )编写 DataFrame 时出现错误。 错误地加入DataFrame.to_html()并index=False提出max_rows(IndexErrorGH 14998) pd.read_hdf()将 a 传递Timestamp给where具有非日期列的参数时出现错误( GH 15492) 错误DataFrame.to_stata(),StataWriter它会为某些语言环境生成格式不正确的文件(GH 13856) 错误StataReader并StataWriter允许无效编码(GH 15723) Series当输出被截断时,repr中的错误不显示长度( GH 15962)。 绘图# 错误在DataFrame.hist哪里plt.tight_layout导致AttributeError(使用)(GH 9351)matplotlib >= 2.0.1 错误在DataFrame.boxplot哪里fontsize没有应用于两个轴上的刻度标签(GH 15108) pandas 使用 matplotlib 注册的日期和时间转换器中的错误不处理多个维度(GH 16026) 错误pd.scatter_matrix()可以接受或color,c但不能同时接受两者(GH 14855) GroupBy/重新采样/滚动# .groupby(..).resample()当经过kwarg 时出现错误on=。 (GH 15021) 正确设置__name__和__qualname__功能Groupby.*(GH 14620) GroupBy.get_group()分类石斑鱼失败的错误( GH 15155) 指定并使用( GH 15130、GH 13966 ).groupby(...).rolling(...)时出现错误onDatetimeIndex timedelta64传递时的 groupby 操作中的错误numeric_only=False(GH 5724) groupby.apply()当并非所有值都是数字时,将 dtypes强制转换object为数字类型时出现错误( GH 14423、GH 15421、GH 15670) 中的错误,在重新采样时间序列时不会应用resample非字符串参数( GH 13218)loffset DataFrame.groupby().describe()对包含元组进行分组时出现错误Index(GH 14848) groupby().nunique()使用 datetimelike-grouper 时出现错误,其中 bin 计数不正确( GH 13453) 错误groupby.transform()会强制生成的数据类型回到原始(GH 10972,GH 11444) 错误groupby.agg()本地化时区datetime(GH 15426、GH 10668、GH 13046) .rolling/expanding()函数中的错误count()不计数np.Inf,也不处理object数据类型(GH 12541) 错误在.rolling()哪里pd.Timedelta或datetime.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_index或right_index导致失败( GH 15676)by 指定pd.merge_asof()时left_index/right_index一起导致失败的错误( GH 15135 )tolerance DataFrame.pivot_table()当列是 dtype 时, where中的错误dropna=True不会删除所有 NaN 列category(GH 15193) pd.melt()传递元组值导致的value_vars错误(TypeErrorGH 15348) pd.pivot_table()当值参数不在列中时没有引发错误的错误( GH 14938) pd.concat()与空数据帧连接join='inner'处理不当的错误( GH 15328) sort=True在加入索引时DataFrame.join和pd.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 15714)mode 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