版本 0.11.0(2013 年 4 月 22 日)#
这是 0.10.1 的主要版本,包含许多新功能和增强功能以及大量错误修复。选择数据的方法增加了相当多的内容,并且 Dtype 支持现已成熟。还有一些重要的 API 更改,Pandas 的长期用户应该密切关注。
文档中有一个新部分,10 分钟了解 Pandas,主要面向新用户。
文档中有一个新部分,Cookbook,这是 pandas 中有用食谱的集合(我们需要贡献!)。
现在有几个库是推荐依赖项
选择选择#
从 0.11.0 开始,对象选择添加了许多用户请求的内容,以支持更明确的基于位置的索引。 pandas 现在支持三种类型的多轴索引。
.loc
严格基于标签,KeyError
当找不到项目时会引发,允许的输入是:单个标签,例如
5
或'a'
,(请注意,它5
被解释为索引的标签。此用途不是沿索引的整数位置)标签列表或数组
['a', 'b', 'c']
带有标签的切片对象
'a':'f'
(请注意,与通常的Python切片相反,开始和结束都包含在内!)布尔数组
查看更多信息,请参阅按标签选择
.iloc
严格基于整数位置(从轴0
到length-1
轴),IndexError
当请求的索引超出范围时将引发。允许的输入有:一个整数例如
5
整数列表或数组
[4, 3, 0]
带有整数的切片对象
1:7
布尔数组
查看更多信息,请参阅按职位选择
.ix
支持混合整数和基于标签的访问。它主要是基于标签的,但会回退到整数位置访问。是最通用的,将支持和.ix
的任何输入,以及对浮点标签方案的支持。在处理混合位置和基于标签的分层索引时特别有用。.loc
.iloc
.ix
由于使用整数切片
.ix
具有不同的行为,具体取决于切片是被解释为基于位置还是基于标签,因此通常最好明确并使用.iloc
or.loc
。
选择弃用#
从版本 0.11.0 开始,这些方法可能会在未来版本中被弃用。
irow
icol
iget_value
请参阅“按位置选择替补”部分。
数据类型#
数字数据类型将传播并可以在 DataFrame 中共存。如果传递了一个数据类型(无论是直接通过关键字dtype
、passedndarray
还是passed)Series
,那么它将被保留在DataFrame操作中。此外,不同的数字数据类型不会被组合。下面的示例将让您体验一下。
In [1]: df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], dtype='float32')
In [2]: df1
Out[2]:
A
0 0.469112
1 -0.282863
2 -1.509058
3 -1.135632
4 1.212112
5 -0.173215
6 0.119209
7 -1.044236
In [3]: df1.dtypes
Out[3]:
A float32
dtype: object
In [4]: df2 = pd.DataFrame({'A': pd.Series(np.random.randn(8), dtype='float16'),
...: 'B': pd.Series(np.random.randn(8)),
...: 'C': pd.Series(range(8), dtype='uint8')})
...:
In [5]: df2
Out[5]:
A B C
0 -0.861816 -0.424972 0
1 -2.105469 0.567020 1
2 -0.494873 0.276232 2
3 1.072266 -1.087401 3
4 0.721680 -0.673690 4
5 -0.706543 0.113648 5
6 -1.040039 -1.478427 6
7 0.271973 0.524988 7
In [6]: df2.dtypes
Out[6]:
A float16
B float64
C uint8
dtype: object
# here you get some upcasting
In [7]: df3 = df1.reindex_like(df2).fillna(value=0.0) + df2
In [8]: df3
Out[8]:
A B C
0 -0.392704 -0.424972 0.0
1 -2.388332 0.567020 1.0
2 -2.003932 0.276232 2.0
3 -0.063367 -1.087401 3.0
4 1.933792 -0.673690 4.0
5 -0.879758 0.113648 5.0
6 -0.920830 -1.478427 6.0
7 -0.772263 0.524988 7.0
In [9]: df3.dtypes
Out[9]:
A float32
B float64
C float64
dtype: object
数据类型转换#
这是下公分母向上转换,这意味着您得到的数据类型可以容纳所有类型
In [10]: df3.values.dtype
Out[10]: dtype('float64')
转换
In [11]: df3.astype('float32').dtypes
Out[11]:
A float32
B float32
C float32
dtype: object
混合转换
In [12]: df3['D'] = '1.'
In [13]: df3['E'] = '1'
In [14]: df3.convert_objects(convert_numeric=True).dtypes
Out[14]:
A float32
B float64
C float64
D float64
E int64
dtype: object
# same, but specific dtype conversion
In [15]: df3['D'] = df3['D'].astype('float16')
In [16]: df3['E'] = df3['E'].astype('int32')
In [17]: df3.dtypes
Out[17]:
A float32
B float64
C float64
D float16
E int32
dtype: object
强制日期强制(以及NaT
非日期时的设置)
In [18]: import datetime
In [19]: s = pd.Series([datetime.datetime(2001, 1, 1, 0, 0), 'foo', 1.0, 1,
....: pd.Timestamp('20010104'), '20010105'], dtype='O')
....:
In [20]: s.convert_objects(convert_dates='coerce')
Out[20]:
0 2001-01-01
1 NaT
2 NaT
3 NaT
4 2001-01-04
5 2001-01-05
dtype: datetime64[ns]
Dtype 陷阱#
平台陷阱
从 0.11.0 开始,DataFrame/Series 的构造将使用默认的 dtypesint64
和float64
,
无论平台如何。这与早期版本的 pandas 相比并没有明显的变化。但是,如果您指定 dtypes,它们将受到尊重(GH 2837)
以下都将产生int64
dtypes
In [21]: pd.DataFrame([1, 2], columns=['a']).dtypes
Out[21]:
a int64
dtype: object
In [22]: pd.DataFrame({'a': [1, 2]}).dtypes
Out[22]:
a int64
dtype: object
In [23]: pd.DataFrame({'a': 1}, index=range(2)).dtypes
Out[23]:
a int64
dtype: object
请记住,这DataFrame(np.array([1,2]))
将int32
在 32 位平台上产生结果!
向上转型的陷阱
对整数类型数据执行索引操作可以轻松地向上转换数据。在nans
未引入的情况下,将保留输入数据的 dtype 。
In [24]: dfi = df3.astype('int32')
In [25]: dfi['D'] = dfi['D'].astype('int64')
In [26]: dfi
Out[26]:
A B C D E
0 0 0 0 1 1
1 -2 0 1 1 1
2 -2 0 2 1 1
3 0 -1 3 1 1
4 1 0 4 1 1
5 0 0 5 1 1
6 0 -1 6 1 1
7 0 0 7 1 1
In [27]: dfi.dtypes
Out[27]:
A int32
B int32
C int32
D int64
E int32
dtype: object
In [28]: casted = dfi[dfi > 0]
In [29]: casted
Out[29]:
A B C D E
0 NaN NaN NaN 1 1
1 NaN NaN 1.0 1 1
2 NaN NaN 2.0 1 1
3 NaN NaN 3.0 1 1
4 1.0 NaN 4.0 1 1
5 NaN NaN 5.0 1 1
6 NaN NaN 6.0 1 1
7 NaN NaN 7.0 1 1
In [30]: casted.dtypes
Out[30]:
A float64
B float64
C float64
D int64
E int32
dtype: object
而 float 数据类型则保持不变。
In [31]: df4 = df3.copy()
In [32]: df4['A'] = df4['A'].astype('float32')
In [33]: df4.dtypes
Out[33]:
A float32
B float64
C float64
D float16
E int32
dtype: object
In [34]: casted = df4[df4 > 0]
In [35]: casted
Out[35]:
A B C D E
0 NaN NaN NaN 1.0 1
1 NaN 0.567020 1.0 1.0 1
2 NaN 0.276232 2.0 1.0 1
3 NaN NaN 3.0 1.0 1
4 1.933792 NaN 4.0 1.0 1
5 NaN 0.113648 5.0 1.0 1
6 NaN NaN 6.0 1.0 1
7 NaN 0.524988 7.0 1.0 1
In [36]: casted.dtypes
Out[36]:
A float32
B float64
C float64
D float16
E int32
dtype: object
日期时间转换#
np.nan
除了传统的NaT
或非时间之外,DataFrame(或系列)中的 Datetime64[ns] 列还允许使用 来指示 nan 值。这允许以通用方式方便地进行 nan 设置。此外,datetime64[ns]
当传递 datetimelike 对象时,默认情况下会创建列(此更改是在 0.10.1 中引入的)(GH 2809、GH 2810)
In [12]: df = pd.DataFrame(np.random.randn(6, 2), pd.date_range('20010102', periods=6),
....: columns=['A', ' B'])
....:
In [13]: df['timestamp'] = pd.Timestamp('20010103')
In [14]: df
Out[14]:
A B timestamp
2001-01-02 0.404705 0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 -0.370647 -1.157892 2001-01-03
2001-01-05 -1.344312 0.844885 2001-01-03
2001-01-06 1.075770 -0.109050 2001-01-03
2001-01-07 1.643563 -1.469388 2001-01-03
# datetime64[ns] out of the box
In [15]: df.dtypes.value_counts()
Out[15]:
float64 2
datetime64[s] 1
Name: count, dtype: int64
# use the traditional nan, which is mapped to NaT internally
In [16]: df.loc[df.index[2:4], ['A', 'timestamp']] = np.nan
In [17]: df
Out[17]:
A B timestamp
2001-01-02 0.404705 0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 NaN -1.157892 NaT
2001-01-05 NaN 0.844885 NaT
2001-01-06 1.075770 -0.109050 2001-01-03
2001-01-07 1.643563 -1.469388 2001-01-03
Astype 转换为datetime64[ns]
to object
,隐式转换NaT
为np.nan
In [18]: import datetime
In [19]: s = pd.Series([datetime.datetime(2001, 1, 2, 0, 0) for i in range(3)])
In [20]: s.dtype
Out[20]: dtype('<M8[ns]')
In [21]: s[1] = np.nan
In [22]: s
Out[22]:
0 2001-01-02
1 NaT
2 2001-01-02
dtype: datetime64[ns]
In [23]: s.dtype
Out[23]: dtype('<M8[ns]')
In [24]: s = s.astype('O')
In [25]: s
Out[25]:
0 2001-01-02 00:00:00
1 NaT
2 2001-01-02 00:00:00
dtype: object
In [26]: s.dtype
Out[26]: dtype('O')
API 更改#
向索引添加了 to_series() 方法,以方便创建索引器(GH 3275)
HDFStore
select_column
添加了从表中选择单个列作为系列的方法。已弃用该
unique
方法,可以通过以下方式复制select_column(key,column).unique()
min_itemsize
参数 toappend
现在将自动为传递的键创建 data_columns
增强功能#
在某些情况下,df.to_csv() 的性能提高了 10 倍。 (GH 3059)
Numexpr 现在是推荐的依赖项,以加速某些类型的数值和布尔运算
瓶颈现在是推荐依赖项,以加速某些类型的
nan
操作
HDFStore
支持
read_hdf/to_hdf
类似的APIread_csv/to_csv
In [27]: df = pd.DataFrame({'A': range(5), 'B': range(5)}) In [28]: df.to_hdf('store.h5', key='table', append=True) In [29]: pd.read_hdf('store.h5', 'table', where=['index > 2']) Out[29]: A B 3 3 3 4 4 4
get
提供从商店访问的点属性,例如store.df == store['df']
提供新的关键字
iterator=boolean
, 和chunksize=number_in_a_chunk
来支持select
和 的迭代select_as_multiple
(GH 3076)您现在可以从无序时间序列中选择时间戳,类似于有序时间序列 ( GH 2437 )
现在,您可以使用类似于日期索引的 DataFrame 中的字符串进行选择,方式与系列 ( GH 3070 )类似
In [30]: idx = pd.date_range("2001-10-1", periods=5, freq='M') In [31]: ts = pd.Series(np.random.rand(len(idx)), index=idx) In [32]: ts['2001'] Out[32]: 2001-10-31 0.117967 2001-11-30 0.702184 2001-12-31 0.414034 Freq: M, dtype: float64 In [33]: df = pd.DataFrame({'A': ts}) In [34]: df['2001'] Out[34]: A 2001-10-31 0.117967 2001-11-30 0.702184 2001-12-31 0.414034
Squeeze
可能从对象中删除长度为 1 的尺寸。>>> p = pd.Panel(np.random.randn(3, 4, 4), items=['ItemA', 'ItemB', 'ItemC'], ... major_axis=pd.date_range('20010102', periods=4), ... minor_axis=['A', 'B', 'C', 'D']) >>> p <class 'pandas.core.panel.Panel'> Dimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis) Items axis: ItemA to ItemC Major_axis axis: 2001-01-02 00:00:00 to 2001-01-05 00:00:00 Minor_axis axis: A to D >>> p.reindex(items=['ItemA']).squeeze() A B C D 2001-01-02 0.926089 -2.026458 0.501277 -0.204683 2001-01-03 -0.076524 1.081161 1.141361 0.479243 2001-01-04 0.641817 -0.185352 1.824568 0.809152 2001-01-05 0.575237 0.669934 1.398014 -0.399338 >>> p.reindex(items=['ItemA'], minor=['B']).squeeze() 2001-01-02 -2.026458 2001-01-03 1.081161 2001-01-04 -0.185352 2001-01-05 0.669934 Freq: D, Name: B, dtype: float64在
pd.io.data.Options
,
修复了在已过期的情况下尝试获取当月数据时的错误。
现在使用 lxml 来抓取 html,而不是 BeautifulSoup(lxml 更快)。
当调用创建调用和放置的方法时,会自动创建新的调用和放置实例变量。这适用于实例变量简单为
calls
和 的当前月份puts
。也适用于未来的到期月份,并将实例变量保存为callsMMYY
或putsMMYY
,其中MMYY
分别是期权到期的月份和年份。
Options.get_near_stock_price
现在允许用户指定获取相关期权数据的月份。
Options.get_forward_data
现在有可选的 kwargsnear
和above_below
.这允许用户指定他们是否只想返回当前股票价格附近的期权的前瞻性数据。这只是从 Options.get_near_stock_price 而不是 Options.get_xxx_data() ( GH 2758)获取数据。光标坐标信息现在显示在时间序列图中。
添加了选项
display.max_seq_items
来控制每个序列打印的元素数量。 (GH 2979)
display.chop_threshold
添加了控制小数值显示的选项。 (GH 2739)添加了选项
display.max_info_rows
以防止针对 1M 行以上的帧计算 verbose_info(可配置)。 (GH 2807,GH 2918)value_counts() 现在接受“标准化”参数,用于标准化直方图。 (GH 2710)。
DataFrame.from_records 现在不仅接受字典,还接受 collections.Mapping ABC 的任何实例。
添加的选项
display.mpl_style
为绘图提供了更时尚的视觉风格。基于https://gist.github.com/huyng/816622 ( GH 3075 )。将布尔值视为整数(值 1 和 0)进行数值运算。 (GH 2641)
to_html() 现在接受可选的“escape”参数来控制保留的 HTML 字符转义(默认启用)和 escapes
&
以及<
和>
。 (GH 2919)
请参阅GitHub 上的完整发行说明或问题跟踪器以获取完整列表。
贡献者#
共有 50 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。
亚当·格林霍尔 +
阿尔瓦罗·特赫罗-坎特罗 +
安迪·海登
布拉德·布兰+
常社
萧启文 +
克里斯·威瑟斯 +
克里斯蒂安·盖尔 +
克里斯托弗·惠兰
达米恩·加劳德
丹·伯肯
丹·戴维森 +
迪特·范登布斯切
德拉赞·卢卡宁 +
德拉赞·卢卡宁 +
加勒特·德拉帕拉
伊利亚·波洛苏欣 +
詹姆斯·卡斯本 +
杰夫·雷巴克
杰里米·瓦格纳 +
乔纳森·钱伯斯 +
K.-迈克尔·埃伊
卡梅尔·艾利森 +
卢伊克·埃斯特夫 +
尼古拉斯·E·哈勒基 +
彼得·普雷滕霍夫 +
菲利普云+
罗伯特·吉塞克 +
船长西博尔德
斯宾塞·里昂
林史蒂芬+
蒂埃里·莫伊桑 +
托马斯·克鲁弗
蒂姆·阿金博 +
维陶塔斯·扬考斯卡斯
维陶塔斯·扬考斯卡斯 +
韦斯·麦金尼
威尔·弗纳斯 +
沃特·奥弗迈尔
异常耙 +
大卫·詹姆斯·香弗莱斯 +
登格曼+
饮食v77 +
杰雷巴克
词性+
史蒂芬·林 +
索克+
维塔斯+
等待郭+
yp