版本 0.18.1(2016 年 5 月 3 日)#

这是 0.18.0 的一个小错误修复版本,包含大量错误修复以及一些新功能、增强功能和性能改进。我们建议所有用户升级到此版本。

亮点包括:

  • .groupby(...)已得到增强,可以在使用.rolling(..),.expanding(..).resample(..)每个组时提供方便的语法,请参阅此处

  • pd.to_datetime()已经获得了从 a 组装日期的能力DataFrame,请参见此处

  • 方法链接改进,请参见此处

  • 自定义营业时间偏移,请参阅此处

  • 处理中的许多错误修复sparse,请参见此处

  • 通过现代熊猫的功能扩展了教程部分,由@TomAugsburger提供。 (GH 13045)。

新功能

自定义营业时间#

它是和CustomBusinessHour的混合,它允许您指定任意假期。详情请参见自定义营业时间GH 11514BusinessHourCustomBusinessDay

In [1]: from pandas.tseries.offsets import CustomBusinessHour

In [2]: from pandas.tseries.holiday import USFederalHolidayCalendar

In [3]: bhour_us = CustomBusinessHour(calendar=USFederalHolidayCalendar())

马丁·路德·金纪念日之前的星期五

In [4]: import datetime

In [5]: dt = datetime.datetime(2014, 1, 17, 15)

In [6]: dt + bhour_us
Out[6]: Timestamp('2014-01-17 16:00:00')

马丁·路德·金纪念日后的星期二(周一因假期而被跳过)

In [7]: dt + bhour_us * 2
Out[7]: Timestamp('2014-01-20 09:00:00')

.groupby(..)带有窗口和重采样操作的方法语法#

.groupby(...)已得到增强,可以在使用.rolling(..),.expanding(..).resample(..)每组时提供方便的语法,请参阅(GH 12486GH 12738)。

您现在可以使用.rolling(..)and.expanding(..)作为 groupby 的方法。它们返回另一个延迟对象(类似于对未分组的 pandas 对象执行的操作).rolling()。然后您可以以类似的方式.expanding()操作这些对象。RollingGroupby

以前,您必须执行此操作才能获得每组的滚动窗口平均值:

In [8]: df = pd.DataFrame({"A": [1] * 20 + [2] * 12 + [3] * 8, "B": np.arange(40)})

In [9]: df
Out[9]: 
    A   B
0   1   0
1   1   1
2   1   2
3   1   3
4   1   4
.. ..  ..
35  3  35
36  3  36
37  3  37
38  3  38
39  3  39

[40 rows x 2 columns]
In [1]: df.groupby("A").apply(lambda x: x.rolling(4).B.mean())
Out[1]:
A
1  0      NaN
   1      NaN
   2      NaN
   3      1.5
   4      2.5
   5      3.5
   6      4.5
   7      5.5
   8      6.5
   9      7.5
   10     8.5
   11     9.5
   12    10.5
   13    11.5
   14    12.5
   15    13.5
   16    14.5
   17    15.5
   18    16.5
   19    17.5
2  20     NaN
   21     NaN
   22     NaN
   23    21.5
   24    22.5
   25    23.5
   26    24.5
   27    25.5
   28    26.5
   29    27.5
   30    28.5
   31    29.5
3  32     NaN
   33     NaN
   34     NaN
   35    33.5
   36    34.5
   37    35.5
   38    36.5
   39    37.5
Name: B, dtype: float64

现在你可以这样做:

In [10]: df.groupby("A").rolling(4).B.mean()
Out[10]: 
A    
1  0      NaN
   1      NaN
   2      NaN
   3      1.5
   4      2.5
         ... 
3  35    33.5
   36    34.5
   37    35.5
   38    36.5
   39    37.5
Name: B, Length: 40, dtype: float64

对于.resample(..)操作类型,以前您必须:

In [11]: df = pd.DataFrame(
   ....:     {
   ....:         "date": pd.date_range(start="2016-01-01", periods=4, freq="W"),
   ....:         "group": [1, 1, 2, 2],
   ....:         "val": [5, 6, 7, 8],
   ....:     }
   ....: ).set_index("date")
   ....: 

In [12]: df
Out[12]: 
            group  val
date                  
2016-01-03      1    5
2016-01-10      1    6
2016-01-17      2    7
2016-01-24      2    8

[4 rows x 2 columns]
In[1]: df.groupby("group").apply(lambda x: x.resample("1D").ffill())
Out[1]:
                  group  val
group date
1     2016-01-03      1    5
      2016-01-04      1    5
      2016-01-05      1    5
      2016-01-06      1    5
      2016-01-07      1    5
      2016-01-08      1    5
      2016-01-09      1    5
      2016-01-10      1    6
2     2016-01-17      2    7
      2016-01-18      2    7
      2016-01-19      2    7
      2016-01-20      2    7
      2016-01-21      2    7
      2016-01-22      2    7
      2016-01-23      2    7
      2016-01-24      2    8

现在你可以这样做:

In[1]: df.groupby("group").resample("1D").ffill()
Out[1]:
                  group  val
group date
1     2016-01-03      1    5
      2016-01-04      1    5
      2016-01-05      1    5
      2016-01-06      1    5
      2016-01-07      1    5
      2016-01-08      1    5
      2016-01-09      1    5
      2016-01-10      1    6
2     2016-01-17      2    7
      2016-01-18      2    7
      2016-01-19      2    7
      2016-01-20      2    7
      2016-01-21      2    7
      2016-01-22      2    7
      2016-01-23      2    7
      2016-01-24      2    8

方法链接改进#

以下方法/索引器现在接受callable.其目的是使这些在方法链中更有用,请参阅文档。 (GH 11485GH 12533

  • .where().mask()

  • .loc[]iloc[].ix[]

  • []索引

方法.where().mask()#

它们可以接受条件和other 参数的可调用。

In [13]: df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})

In [14]: df.where(lambda x: x > 4, lambda x: x + 10)
Out[14]: 
    A   B  C
0  11  14  7
1  12   5  8
2  13   6  9

[3 rows x 3 columns]

方法.loc[].iloc[].ix[]

它们可以接受可调用的和可调用的元组作为切片器。可调用函数可以返回有效的布尔索引器或对这些索引器的输入有效的任何内容。

# callable returns bool indexer
In [15]: df.loc[lambda x: x.A >= 2, lambda x: x.sum() > 10]
Out[15]: 
   B  C
1  5  8
2  6  9

[2 rows x 2 columns]

# callable returns list of labels
In [16]: df.loc[lambda x: [1, 2], lambda x: ["A", "B"]]
Out[16]: 
   A  B
1  2  5
2  3  6

[2 rows x 2 columns]

用#建立索引[]

[]最后,您可以在Series、DataFrame 和 Panel 的索引中使用可调用函数。可调用对象必须[]根据其类和索引类型返回有效的索引输入。

In [17]: df[lambda x: "A"]
Out[17]: 
0    1
1    2
2    3
Name: A, Length: 3, dtype: int64

使用这些方法/索引器,您可以链接数据选择操作,而无需使用临时变量。

In [18]: bb = pd.read_csv("data/baseball.csv", index_col="id")

In [19]: (bb.groupby(["year", "team"]).sum(numeric_only=True).loc[lambda df: df.r > 100])
Out[19]: 
           stint    g    ab    r    h  X2b  ...     so   ibb   hbp    sh    sf  gidp
year team                                   ...                                     
2007 CIN       6  379   745  101  203   35  ...  127.0  14.0   1.0   1.0  15.0  18.0
     DET       5  301  1062  162  283   54  ...  176.0   3.0  10.0   4.0   8.0  28.0
     HOU       4  311   926  109  218   47  ...  212.0   3.0   9.0  16.0   6.0  17.0
     LAN      11  413  1021  153  293   61  ...  141.0   8.0   9.0   3.0   8.0  29.0
     NYN      13  622  1854  240  509  101  ...  310.0  24.0  23.0  18.0  15.0  48.0
     SFN       5  482  1305  198  337   67  ...  188.0  51.0   8.0  16.0   6.0  41.0
     TEX       2  198   729  115  200   40  ...  140.0   4.0   5.0   2.0   8.0  16.0
     TOR       4  459  1408  187  378   96  ...  265.0  16.0  12.0   4.0  16.0  38.0

[8 rows x 18 columns]

当#DatetimeIndex的一部分时部分字符串索引MultiIndex

部分字符串索引现在匹配a ( GH 10331 )DateTimeIndex的一部分MultiIndex

In [20]: dft2 = pd.DataFrame(
   ....:     np.random.randn(20, 1),
   ....:     columns=["A"],
   ....:     index=pd.MultiIndex.from_product(
   ....:         [pd.date_range("20130101", periods=10, freq="12H"), ["a", "b"]]
   ....:     ),
   ....: )
   ....:

In [21]: dft2
Out[21]:
                              A
2013-01-01 00:00:00 a  0.469112
                    b -0.282863
2013-01-01 12:00:00 a -1.509059
                    b -1.135632
2013-01-02 00:00:00 a  1.212112
...                         ...
2013-01-04 12:00:00 b  0.271860
2013-01-05 00:00:00 a -0.424972
                    b  0.567020
2013-01-05 12:00:00 a  0.276232
                    b -1.087401

[20 rows x 1 columns]

In [22]: dft2.loc["2013-01-05"]
Out[22]:
                              A
2013-01-05 00:00:00 a -0.424972
                    b  0.567020
2013-01-05 12:00:00 a  0.276232
                    b -1.087401

[4 rows x 1 columns]

在其他层面上

In [26]: idx = pd.IndexSlice

In [27]: dft2 = dft2.swaplevel(0, 1).sort_index()

In [28]: dft2
Out[28]:
                              A
a 2013-01-01 00:00:00  0.469112
  2013-01-01 12:00:00 -1.509059
  2013-01-02 00:00:00  1.212112
  2013-01-02 12:00:00  0.119209
  2013-01-03 00:00:00 -0.861849
...                         ...
b 2013-01-03 12:00:00  1.071804
  2013-01-04 00:00:00 -0.706771
  2013-01-04 12:00:00  0.271860
  2013-01-05 00:00:00  0.567020
  2013-01-05 12:00:00 -1.087401

[20 rows x 1 columns]

In [29]: dft2.loc[idx[:, "2013-01-05"], :]
Out[29]:
                              A
a 2013-01-05 00:00:00 -0.424972
  2013-01-05 12:00:00  0.276232
b 2013-01-05 00:00:00  0.567020
  2013-01-05 12:00:00 -1.087401

[4 rows x 1 columns]

组装日期时间#

pd.to_datetime()已经获得了从传入的DataFrame或字典中组装日期时间的能力。 (GH 8158)。

In [20]: df = pd.DataFrame(
   ....:     {"year": [2015, 2016], "month": [2, 3], "day": [4, 5], "hour": [2, 3]}
   ....: )
   ....: 

In [21]: df
Out[21]: 
   year  month  day  hour
0  2015      2    4     2
1  2016      3    5     3

[2 rows x 4 columns]

使用传递过来的框架进行组装。

In [22]: pd.to_datetime(df)
Out[22]: 
0   2015-02-04 02:00:00
1   2016-03-05 03:00:00
Length: 2, dtype: datetime64[ns]

您只能传递需要组装的列。

In [23]: pd.to_datetime(df[["year", "month", "day"]])
Out[23]: 
0   2015-02-04
1   2016-03-05
Length: 2, dtype: datetime64[ns]

其他增强功能#

  • pd.read_csv()现在支持delim_whitespace=TruePython引擎(GH 12958

  • pd.read_csv()现在支持通过扩展名推断或显式打开包含单个 CSV 的 ZIP 文件compression='zip'( GH 12175 )

  • pd.read_csv()现在支持使用 xz 压缩打开文件,通过扩展名推断或显式compression='xz'指定;压缩也以同样的方式xz支持( GH 11852DataFrame.to_csv

  • pd.read_msgpack()现在即使使用压缩(GH 12359)也总是给出可写的 ndarrays 。

  • pd.read_msgpack()现在支持使用 msgpack 对分类进行序列化和反序列化(GH 12573

  • .to_json()现在支持NDFrames包含分类和稀疏数据(GH 10778

  • interpolate()现在支持method='akima'GH 7588)。

  • pd.read_excel()现在接受文件路径的路径对象(例如pathlib.Pathpy.path.local),与其他read_*函数(GH 12655)一致

  • .weekday_name将属性作为组件添加到访问器DatetimeIndex.dt。 (GH 11128

  • Index.take现在处理allow_fillfill_value一致(GH 12631

    In [24]: idx = pd.Index([1.0, 2.0, 3.0, 4.0], dtype="float")
    
    # default, allow_fill=True, fill_value=None
    In [25]: idx.take([2, -1])
    Out[25]: Index([3.0, 4.0], dtype='float64')
    
    In [26]: idx.take([2, -1], fill_value=True)
    Out[26]: Index([3.0, nan], dtype='float64')
    
  • Index现在支持.str.get_dummies()which return MultiIndex,请参阅创建指示变量GH 10008GH 10103

    In [27]: idx = pd.Index(["a|b", "a|c", "b|c"])
    
    In [28]: idx.str.get_dummies("|")
    Out[28]: 
    MultiIndex([(1, 1, 0),
                (1, 0, 1),
                (0, 1, 1)],
               names=['a', 'b', 'c'])
    
  • pd.crosstab()获得了normalize规范化频率表的论据(GH 12569)。此处更新的文档中的示例。

  • .resample(..).interpolate()现已支持(GH 12925

  • .isin()现在接受通过setsGH 12988

稀疏的变化#

这些更改符合稀疏处理以返回正确的类型,并致力于提供更流畅的索引体验。

SparseArray.take现在为其他标量输入返回一个标量SparseArray。此外,它使用与IndexGH 10560GH 12796)相同的规则处理负索引器

s = pd.SparseArray([np.nan, np.nan, 1, 2, 3, np.nan, 4, 5, np.nan, 6])
s.take(0)
s.take([1, 2, 3])
  • 加薪SparseSeries[]索引中的错误(GH 9467EllipsisKeyError

  • 元组索引中的错误SparseArray[]未正确处理(GH 12966

  • SparseSeries.loc[]类似列表的输入引发错误TypeErrorGH 10560

  • SparseSeries.iloc[]标量输入中的错误可能会引发IndexErrorGH 10560

  • 错误SparseSeries.loc[].iloc[]返回sliceSparseArray而不是SparseSeriesGH 10560

  • 错误SparseDataFrame.loc[].iloc[]可能会导致密集Series,而不是SparseSeriesGH 12787

  • 另外错误SparseArray忽略了fill_value右手边(GH 12910

  • mod中的错误SparseArray引发AttributeErrorGH 12910

  • pow中的错误SparseArray计算为必须为 1 ( GH 12910 )1 ** np.nannp.nan

  • SparseArray比较输出中的错误可能会导致错误结果或引发错误ValueErrorGH 12971

  • 当长度超过( GH 10560 )时,错误就会SparseSeries.__repr__出现TypeErrormax_rows

  • SparseSeries.shape忽略错误fill_valueGH 10452

  • 错误SparseSeries并且可能与其密集值SparseArray不同( GH 12908dtype

  • 错误SparseSeries.reindex处理错误fill_valueGH 12797

  • SparseArray.to_frame()结果中的错误DataFrame,而不是SparseDataFrameGH 9850

  • BugSparseSeries.value_counts()不算在内fill_valueGH 6749

  • 错误SparseArray.to_dense()不保留dtypeGH 10648

  • 错误SparseArray.to_dense()处理错误fill_valueGH 12797

  • 密集结果中pd.concat()的错误( GH 10536SparseSeries

  • 错误处理pd.concat()的错误(GH 9765SparseDataFramefill_value

  • pd.concat()可能SparseDataFrame会引发错误AttributeErrorGH 12174

  • 错误SparseArray.shift()可能会引发NameErrorTypeErrorGH 12908

API 更改#

方法.groupby(..).nth()改变#

当传递参数时,输出中的索引.groupby(..).nth()现在更加一致( GH 11039):as_index

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

In [30]: df
Out[30]: 
   A  B
0  a  1
1  b  2
2  a  3

[3 rows x 2 columns]

以前的行为:

In [3]: df.groupby('A', as_index=True)['B'].nth(0)
Out[3]:
0    1
1    2
Name: B, dtype: int64

In [4]: df.groupby('A', as_index=False)['B'].nth(0)
Out[4]:
0    1
1    2
Name: B, dtype: int64

新行为:

In [31]: df.groupby("A", as_index=True)["B"].nth(0)
Out[31]: 
0    1
1    2
Name: B, Length: 2, dtype: int64

In [32]: df.groupby("A", as_index=False)["B"].nth(0)
Out[32]: 
0    1
1    2
Name: B, Length: 2, dtype: int64

此外,以前,a.groupby总是排序,无论是否sort=False通过 传递.nth()

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

In [34]: df = pd.DataFrame(np.random.randn(100, 2), columns=["a", "b"])

In [35]: df["c"] = np.random.randint(0, 4, 100)

以前的行为:

In [4]: df.groupby('c', sort=True).nth(1)
Out[4]:
          a         b
c
0 -0.334077  0.002118
1  0.036142 -2.074978
2 -0.720589  0.887163
3  0.859588 -0.636524

In [5]: df.groupby('c', sort=False).nth(1)
Out[5]:
          a         b
c
0 -0.334077  0.002118
1  0.036142 -2.074978
2 -0.720589  0.887163
3  0.859588 -0.636524

新行为:

In [36]: df.groupby("c", sort=True).nth(1)
Out[36]: 
           a         b  c
2  -0.720589  0.887163  2
3   0.859588 -0.636524  3
7  -0.334077  0.002118  0
21  0.036142 -2.074978  1

[4 rows x 3 columns]

In [37]: df.groupby("c", sort=False).nth(1)
Out[37]: 
           a         b  c
2  -0.720589  0.887163  2
3   0.859588 -0.636524  3
7  -0.334077  0.002118  0
21  0.036142 -2.074978  1

[4 rows x 3 columns]

NumPy 函数兼容性#

通过增强方法的签名,大大提高了pandas 类数组方法(例如sumtake)与其对应方法之间的兼容性,以便接受可以从 传入的参数,即使它们不一定在实现中使用(GH 12644 , GH 12638 , GH 12687 )numpypandasnumpypandas

  • .searchsorted()forIndex现在TimedeltaIndex接受一个sorter参数以保持与 numpysearchsorted函数的兼容性(GH 12238

  • ( GH 12600 )np.round()上的numpy 兼容性错误Series

下面说明了此签名增强的示例:

sp = pd.SparseDataFrame([1, 2, 3])
sp

以前的行为:

In [2]: np.cumsum(sp, axis=0)
...
TypeError: cumsum() takes at most 2 arguments (4 given)

新行为:

np.cumsum(sp, axis=0)

用于.applyGroupBy 重采样#

使用apply重采样 groupby 操作(使用 a )现在与其他 groupby 操作上的pd.TimeGrouper类似调用具有相同的输出类型。 applyGH 11742)。

In [38]: df = pd.DataFrame(
   ....:     {"date": pd.to_datetime(["10/10/2000", "11/10/2000"]), "value": [10, 13]}
   ....: )
   ....: 

In [39]: df
Out[39]: 
        date  value
0 2000-10-10     10
1 2000-11-10     13

[2 rows x 2 columns]

以前的行为:

In [1]: df.groupby(pd.TimeGrouper(key='date',
   ...:                           freq='M')).apply(lambda x: x.value.sum())
Out[1]:
...
TypeError: cannot concatenate a non-NDFrame object

# Output is a Series
In [2]: df.groupby(pd.TimeGrouper(key='date',
   ...:                           freq='M')).apply(lambda x: x[['value']].sum())
Out[2]:
date
2000-10-31  value    10
2000-11-30  value    13
dtype: int64

新行为:

# Output is a Series
In [55]: df.groupby(pd.TimeGrouper(key='date',
    ...:                           freq='M')).apply(lambda x: x.value.sum())
Out[55]:
date
2000-10-31    10
2000-11-30    13
Freq: M, dtype: int64

# Output is a DataFrame
In [56]: df.groupby(pd.TimeGrouper(key='date',
    ...:                           freq='M')).apply(lambda x: x[['value']].sum())
Out[56]:
            value
date
2000-10-31     10
2000-11-30     13

read_csv例外情况的变化#

为了标准化和引擎 read_csv的 API ,两者现在都将引发, 的子类,以响应空列或标题(GH 12493GH 12506cpythonEmptyDataErrorValueError

以前的行为:

In [1]: import io

In [2]: df = pd.read_csv(io.StringIO(''), engine='c')
...
ValueError: No columns to parse from file

In [3]: df = pd.read_csv(io.StringIO(''), engine='python')
...
StopIteration

新行为:

In [1]: df = pd.read_csv(io.StringIO(''), engine='c')
...
pandas.io.common.EmptyDataError: No columns to parse from file

In [2]: df = pd.read_csv(io.StringIO(''), engine='python')
...
pandas.io.common.EmptyDataError: No columns to parse from file

除了此错误更改之外,还进行了其他一些更改:

  • CParserError现在是子类,ValueError而不仅仅是ExceptionGH 12551

  • 当引擎无法解析列时,现在会引发ACParserError而不是泛型( GH 12506Exceptionread_csvc

  • 当引擎遇到整数列中的值时,现在会引发AValueError而不是泛型( GH 12506Exceptionread_csvcNaN

  • 现在,当指定时,会引发 A 而不是泛型,并且引擎在ValueError包含不可编码字节的列中遇到元素 ( GH 12506 )Exceptionread_csvtrue_valuesc

  • pandas.parser.OverflowError异常已被删除并已替换为 Python 的内置OverflowError异常 ( GH 12506 )

  • pd.read_csv()不再允许参数使用字符串和整数的组合usecolsGH 12678

方法to_datetime错误改变#

pd.to_datetime()传递unit带有可转换条目和errors='coerce'/或不可转换条目的a 时出现错误errors='ignore'。此外,OutOfBoundsDateime当 时遇到该单位的超出范围的值时,将会引发异常errors='raise'。 (GH 11758GH 13052GH 13059

以前的行为:

In [27]: pd.to_datetime(1420043460, unit='s', errors='coerce')
Out[27]: NaT

In [28]: pd.to_datetime(11111111, unit='D', errors='ignore')
OverflowError: Python int too large to convert to C long

In [29]: pd.to_datetime(11111111, unit='D', errors='raise')
OverflowError: Python int too large to convert to C long

新行为:

In [2]: pd.to_datetime(1420043460, unit='s', errors='coerce')
Out[2]: Timestamp('2014-12-31 16:31:00')

In [3]: pd.to_datetime(11111111, unit='D', errors='ignore')
Out[3]: 11111111

In [4]: pd.to_datetime(11111111, unit='D', errors='raise')
OutOfBoundsDatetime: cannot convert input with unit 'D'

其他 API 更改#

  • .swaplevel()for SeriesDataFramePanelMultiIndexnow 的前两个参数具有默认值i,并且j交换索引最内层的两个级别。 (GH 12934

  • .searchsorted()forIndex现在TimedeltaIndex接受一个sorter参数以保持与 numpysearchsorted函数的兼容性(GH 12238

  • Period现在PeriodIndex引发继承而不是原始的IncompatibleFrequency错误(GH 12615ValueErrorValueError

  • Series.apply对于类别 dtype 现在将传递的函数应用于每个.categories(而不是.codes),并在可能的情况下返回一个categorydtype ( GH 12473 )

  • read_csv现在将引发一个TypeErrorifparse_dates既不是布尔值、列表也不是字典(与文档字符串匹配)(GH 5636

  • 默认值为.query()/.eval()now ,如果已安装,engine=None则会使用它;numexpr否则它将回退到python引擎。如果安装了 numexpr,这会模仿 0.18.1 之前的行为numexpr(以前,如果未安装 numexpr,.query()/.eval()则会引发该行为)。 (GH 12749

  • pd.show_versions()现在包括pandas_datareader版本(GH 12740

  • 为通用函数提供适当的__name__属性( GH 12021__qualname__

  • pd.concat(ignore_index=True)现在RangeIndex用作默认值(GH 12695

  • pd.merge()并在合并/加入单级数据帧和多级数据帧时DataFrame.join()显示( GH 9455GH 12219UserWarning

  • 对于已弃用的插值方法,与scipy> 0.17兼容;piecewise_polynomial支持替换from_derivatives方法(GH 12887

弃用#

  • 该方法名称Index.sym_diff()已弃用,可以替换为Index.symmetric_difference()GH 12591

  • 方法名称Categorical.sort()已弃用,取而代之的是Categorical.sort_values()GH 12882

性能改进#

  • 提高 SAS 读卡器的速度(GH 12656GH 12961

  • .groupby(..).cumcount()( GH 11039 )中的性能改进

  • pd.read_csv()改进了使用时的内存使用skiprows=an_integerGH 13005

  • DataFrame.to_sql改进了检查表的大小写敏感性时的性能。现在仅当表名不是小写时检查表是否已正确创建。 (GH 12876

  • Period改进了构造和时间序列绘图的性能( GH 12903GH 11831)。

  • 改进的性能.str.encode().str.decode()方法(GH 13008

  • 改进了输入为数字数据类型时的性能to_numericGH 12777

  • IntIndex使用( GH 13036 )改进了稀疏算术的性能

Bug修复

  • usecolspd.read_csv即使 CSV 文件的行不均匀,现在也会考虑参数 in ( GH 12203 )

  • groupby.transform(..)axis=1使用非单调有序索引指定时出现错误( GH 12713

  • 如果指定,则会引发错误PeriodPeriodIndex创建。请注意,“分钟”频率在 v0.17.0 中已弃用,建议使用(GH 11854KeyErrorfreq="Minute"freq="T"

  • Bug.resample(...).count()总是PeriodIndex提高TypeError( GH 12774 )

  • 当空时(GH 12868.resample(...)进行铸造错误PeriodIndexDatetimeIndex

  • 重新采样到现有频率时出现错误.resample(...)GH 12770PeriodIndex

  • Period打印包含不同freq提升的数据中的错误ValueErrorGH 12615

  • 指定了和 的Series构造错误( GH 12574Categoricaldtype='category'

  • 与强制 dtype 串联的错误过于激进,导致当对象长于display.max_rowsGH 12411GH 12045GH 11594GH 10571GH 12211)时,输出格式中出现不同的 dtypes

  • 选项中的错误float_format,选项未验证为可调用。 (GH 12706

  • GroupBy.filterdropna=False没有组满足标准时出现错误( GH 12768

  • __name__功能错误.cum*GH 12021

  • .astype()从一个Float64Inde/Int64Index到一个的窃听Int64IndexGH 12881

  • .to_json()/.read_json()在何时orient='index'(默认)(GH 12866)中往返基于整数的索引时出现错误

  • Categorical尝试堆叠条形图时,绘制数据类型中的错误会导致错误( GH 13019

  • 与 >= numpy1.11 兼容以NaT进行比较(GH 12969

  • 使用.drop()非唯一的MultiIndex. (GH 12701

  • .concat日期时间 tz 感知和幼稚 DataFrame 的错误( GH 12467

  • 传递非字符串时正确引发ValueErrorin 的错误( GH 12952.resample(..).fillna(..)

  • 修复了各种编码和标头处理问题pd.read_sas()GH 12659GH 12654GH 12647GH 12809

  • where中的错误pd.crosstab()会默默地忽略aggfuncif values=None( GH 12569 )。

  • DataFrame.to_json序列化时可能出现段错误datetime.timeGH 11473)。

  • DataFrame.to_json尝试序列化 0d 数组时可能出现段错误( GH 11299 )。

  • to_json尝试序列化 aDataFrameSeries与非 ndarray 值时出现段错误;现在支持categorysparse和dtypes 的序列化(GH 10778)。datetime64[ns, tz]

  • 错误DataFrame.to_json在于不支持的数据类型未传递给默认处理程序(GH 12554)。

  • .align不返回子类的错误( GH 12983

  • Series将 a与 a对齐时出现错误DataFrameGH 13037

  • 错误,ABCPanel其中Panel4D未被视为此泛型类型的有效实例(GH 12810

  • .name案例一致性错误.groupby(..).apply(..)GH 12363

  • Timestamp.__repr__导致pprint嵌套结构失败的错误( GH 12622

  • Timedelta.min和中的错误Timedelta.max,属性现在报告timedeltaspandas 识别的真实最小值/最大值。请参阅文档。 (GH 12727

  • .quantile()插值中的错误可能会float意外强制(GH 12772

  • .quantile()空的错误Series可能会返回标量而不是空SeriesGH 12772

  • .loc大型索引器中的越界错误会引发而IndexError不是KeyErrorGH 12527

  • 使用 和 时重新采样的错误TimedeltaIndex.asfreq()以前不会包括最终的栅栏柱(GH 12926

  • Categorical与a 中的相等测试中的错误DataFrameGH 12564

  • 错误GroupBy.first(),使用.last()时返回不正确的行( GH 7453TimeGrouper

  • 在引用的项目中指定换行符时,引擎pd.read_csv()会出现错误(GH 10911GH 12775cskiprows

  • DataFrame分配 tz 感知日期时间并对齐时丢失时区错误Series( GH 12981 )

  • 空值.value_counts()何时normalize=Truedropna=True地仍然对标准化计数产生影响的错误(GH 12558

  • Series.value_counts()如果其 dtype 为categoryGH 12835),则错误会丢失名称

  • 错误Series.value_counts()丢失时区信息(GH 12835

  • Series.value_counts(normalize=True)加注错误(GHCategorical 12835 )UnboundLocalError

  • Panel.fillna()忽略错误inplace=TrueGH 12633

  • 与引擎同时pd.read_csv()指定namesusecols和时出现错误( GH 9755 )parse_datesc

  • 指定引擎并同时使用pd.read_csv()时出现错误(GH 12912delim_whitespace=Truelineterminatorc

  • 中的错误Series.renameDataFrame.rename并且DataFrame.rename_axis不将其Series视为重新标记的映射(GH 12623)。

  • 清理.rolling.min.rolling.max增强数据类型处理(GH 12373

  • groupby复杂类型被强制浮动的错误( GH 12902

  • 如果其 dtype或 tz 感知,则会Series.map引发错误(GH 12473TypeErrorcategorydatetime

  • 32 位平台上的一些测试比较中的错误 ( GH 12972 )

  • 从构造中回退时索引强制的错误RangeIndexGH 12893

  • 当传递无效参数(例如浮动窗口)时,窗口函数中出现更好的错误消息(GH 12669

  • DataFrame定义返回子类的切片子类中的错误Series可能会返回正常SeriesGH 11559

  • 如果输入有并且结果是或(GH 12617),.str则访问器方法中的错误可能会出现ValueErrornameDataFrameMultiIndex

  • DataFrame.last_valid_index()空框架中和空框架上的错误DataFrame.first_valid_index()GH 12800

  • 错误CategoricalIndex.get_loc返回与常规结果不同的结果IndexGH 12531

  • PeriodIndex.resample名称未传播的错误( GH 12769

  • date_range closed关键字和时区中的错误( GH 12684)。

  • 当输入数据包含 tz 感知的日期时间和 timedelta 时,会pd.concat引发错误( GH 12620AttributeError

  • 错误pd.concat没有Series正确处理空(GH 11082

  • 使用( GH 12979 )指定.plot.bar时出现对齐错误widthint

  • fill_value如果二元运算符的参数是常量,则忽略错误( GH 12723

  • pd.read_html()使用 bs4 风格和带有标题且只有一列的解析表时出现错误( GH 9178 )

  • 空值.pivot_table何时margins=Truedropna=True地仍对保证金计数产生影响的错误(GH 12577

  • 表索引/列名称消失.pivot_table时出现错误( GH 12133dropna=False

  • pd.crosstab()何时margins=True以及哪个引发的错误dropna=FalseGH 12642

  • Series.namename属性可以是可散列类型时出现的错误( GH 12610

  • .describe()重置分类列信息中的错误( GH 11558

  • 调用时间序列loffset时未应用参数的错误( GH 12725resample().count()

  • pd.read_excel()现在接受与关键字参数关联的列名称namesGH 12870

  • 错误pd.to_numeric()Index回报np.ndarray,而不是IndexGH 12777

  • pd.to_numeric()类似日期时间的错误可能会引发TypeErrorGH 12777

  • pd.to_numeric()标量加注错误ValueError( GH 12777 )

贡献者#

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

  • 安德鲁·菲奥雷-加特兰 +

  • 巴斯蒂安+

  • 伯努瓦·维诺 +

  • 布兰登·罗德 +

  • 达科克斯+

  • 德鲁·福斯汀 +

  • 埃内斯托·弗雷塔斯 +

  • 菲利普·特尔+

  • 格雷戈里·利夫希茨 +

  • 加博·利普塔克

  • 哈桑·基比里盖 +

  • 林宜比利斯

  • 以色列·萨埃塔·佩雷斯 +

  • 贾森·沃洛索诺维奇 +

  • 杰夫·雷巴克

  • 乔·杰夫尼克

  • 乔里斯·范登博什

  • 约书亚·斯托克 +

  • 陈嘉禾

  • 克比谢登

  • 基兰·奥马霍尼

  • 莱夫·沃尔什 +

  • 马哈茂德·拉巴比迪 +

  • 刘茂源 +

  • 马克·罗斯 +

  • 马特·维特曼

  • 最大U+

  • 马克西米利安·鲁斯

  • 迈克尔·德鲁特布姆 +

  • 尼克·尤班克

  • 尼古拉斯·博诺特

  • 氧化磷+

  • 保利·维尔塔宁 +

  • 彼得·沃勒 +

  • 彼得罗·巴蒂斯顿

  • 普拉布约特·辛格 +

  • 罗宾·威尔逊

  • 罗杰·托马斯 +

  • 塞巴斯蒂安银行

  • 斯蒂芬·胡佛

  • 蒂姆·霍珀 +

  • 汤姆·奥格斯普格

  • 王爱勇

  • 韦斯·特纳

  • 维南德+

  • 酒吧+

  • 严发才+

  • 阿德努+

  • ajenkins-cargometrics +

  • 贝赫扎德·努里

  • 钦斯基 +

  • 格菲扬

  • 杰普斯杂志 +

  • 乔纳斯布+

  • 科特法+

  • 尼罗河船员 +

  • 个和零

  • RS2+

  • 辛赫克斯

  • tsdlovell +