标量值
data 是标量值时,必须提供索引。Series 按索引长度重复该标量值。
In [12]: pd.Series(5., index=['a', 'b', 'c', 'd', 'e']) Out[12]: a 5.0 b 5.0 c 5.0 d 5.0 e 5.0 dtype: float64
#Series 类似多维数组
Series 操作与 ndarray 类似,支持大多数 NumPy 函数,还支持索引切片。
In [13]: s[0] Out[13]: 0.4691122999071863 In [14]: s[:3] Out[14]: a 0.469112 b -0.282863 c -1.509059 dtype: float64 In [15]: s[s > s.median()] Out[15]: a 0.469112 e 1.212112 dtype: float64 In [16]: s[[4, 3, 1]] Out[16]: e 1.212112 d -1.135632 b -0.282863 dtype: float64 In [17]: np.exp(s) Out[17]: a 1.598575 b 0.753623 c 0.221118 d 0.321219 e 3.360575 dtype: float64
注意
索引与选择数据一节介绍了 s[[4, 3, 1]] 等数组索引操作
和 NumPy 数组一样,Series 也支持 dtype。
Pandas 索引和数据选择器
索引和数据选择器
Pandas对象中的轴标记信息有多种用途:
使用已知指标识别数据(即提供元数据),这对于分析,可视化和交互式控制台显示非常重要。
启用自动和显式数据对齐。
允许直观地获取和设置数据集的子集。
在本节中,我们将重点关注最后一点:即如何切片,切块,以及通常获取和设置pandas对象的子集。主要关注的是Series和DataFrame,因为他们在这个领域受到了更多的开发关注。
注意
Python和NumPy索引运算符[]和属性运算符. 可以在各种用例中快速轻松地访问pandas数据结构。这使得交互式工作变得直观,因为如果您已经知道如何处理Python字典和NumPy数组,那么几乎没有新的东西需要学习。但是,由于预先不知道要访问的数据类型,因此直接使用标准运算符会有一些优化限制。对于生产代码,我们建议您利用本章中介绍的优化的pandas数据访问方法。
警告
是否为设置操作返回副本或引用可能取决于上下文。这有时被称为应该避免。请参阅返回视图与复制。chained assignment
警使用浮点数对基于整数的索引进行索引已在0.18.0中进行了说明,有关更改的摘要,请参见此处
见多指标/高级索引的MultiIndex和更先进的索引文件。
有关一些高级策略,请参阅食谱。
#索引的不同选择
对象选择已经有许多用户请求的添加,以支持更明确的基于位置的索引。Pandas现在支持三种类型的多轴索引。
.loc主要是基于标签的,但也可以与布尔数组一起使用。当找不到物品时.loc会提高KeyError。允许的输入是:
单个标签,例如5或'a'(注意,它5被解释为索引的 标签。此用法不是索引的整数位置。)。
列表或标签数组。['a', 'b', 'c']
带标签的切片对象'a':'f'(注意,相反普通的Python片,都开始和停止都包括在内,当存在于索引中!见有标签切片 和端点都包括在内。)
布尔数组
一个callable带有一个参数的函数(调用Series或DataFrame)并返回有效的索引输出(上面的一个)。
版本0.18.1中的新功能。
在标签选择中查看更多信息。
.iloc是基于主要的整数位置(从0到 length-1所述轴的),但也可以用布尔阵列使用。 如果请求的索引器超出范围,.iloc则会引发IndexError,但允许越界索引的切片索引器除外。(这符合Python / NumPy 切片 语义)。允许的输入是:
一个整数,例如5。
整数列表或数组。[4, 3, 0]
带有整数的切片对象1:7。
布尔数组。
一个callable带有一个参数的函数(调用Series或DataFrame)并返回有效的索引输出(上面的一个)。
版本0.18.1中的新功能。
有关详细信息,请参阅按位置选择,高级索引和高级层次结构。
.loc,.iloc以及[]索引也可以接受一个callable索引器。在Select By Callable中查看更多信息。
从具有多轴选择的对象获取值使用以下表示法(使用.loc作为示例,但以下也适用.iloc)。任何轴访问器可以是空切片:。假设超出规范的轴是:,例如p.loc['a']相当于 。p.loc['a', :, :]
#基础知识
正如在上一节中介绍数据结构时所提到的,索引的主要功能[]
(也就是__getitem__
那些熟悉在Python中实现类行为的人)是选择低维切片。下表显示了使用以下方法索引pandas对象时的返回类型值[]
:
在这里,我们构建一个简单的时间序列数据集,用于说明索引功能:
In [1]: dates = pd.date_range('1/1/2000', periods=8) In [2]: df = pd.DataFrame(np.random.randn(8, 4), ...: index=dates, columns=['A', 'B', 'C', 'D']) ...: In [3]: df Out[3]: A B C D 2000-01-01 0.469112 -0.282863 -1.509059 -1.135632 2000-01-02 1.212112 -0.173215 0.119209 -1.044236 2000-01-03 -0.861849 -2.104569 -0.494929 1.071804 2000-01-04 0.721555 -0.706771 -1.039575 0.271860 2000-01-05 -0.424972 0.567020 0.276232 -1.087401 2000-01-06 -0.673690 0.113648 -1.478427 0.524988 2000-01-07 0.404705 0.577046 -1.715002 -1.039268 2000-01-08 -0.370647 -1.157892 -1.344312 0.844885
Pandas 处理文本字符串
Pandas 处理文本字符串
序列和索引包含一些列的字符操作方法,这可以使我们轻易操作数组中的各个元素。最重要的是,这些方法可以自动跳过 缺失/NA 值。这些方法可以在str
属性中访问到,并且基本上和python内建的(标量)字符串方法同名:
In [1]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) In [2]: s.str.lower() Out[2]: 0 a 1 b 2 c 3 aaba 4 baca 5 NaN 6 caba 7 dog 8 cat dtype: object In [3]: s.str.upper() Out[3]: 0 A 1 B 2 C 3 AABA 4 BACA 5 NaN 6 CABA 7 DOG 8 CAT dtype: object In [4]: s.str.len() Out[4]: 0 1.0 1 1.0 2 1.0 3 4.0 4 4.0 5 NaN 6 4.0 7 3.0 8 3.0 dtype: float64
In [5]: idx = pd.Index([' jack', 'jill ', ' jesse ', 'frank']) In [6]: idx.str.strip() Out[6]: Index(['jack', 'jill', 'jesse', 'frank'], dtype='object') In [7]: idx.str.lstrip() Out[7]: Index(['jack', 'jill ', 'jesse ', 'frank'], dtype='object') In [8]: idx.str.rstrip() Out[8]: Index([' jack', 'jill', ' jesse', 'frank'], dtype='object')
索引的字符串方法在清理或者转换数据表列的时候非常有用。例如,你的列中或许会包含首位的白空格:
In [9]: df = pd.DataFrame(np.random.randn(3, 2), ...: columns=[' Column A ', ' Column B '], index=range(3)) ...: In [10]: df Out[10]: Column A Column B 0 0.469112 -0.282863 1 -1.509059 -1.135632 2 1.212112 -0.173215
这些字符串方法可以被用来清理需要的列。这里,我们想清理开头和结尾的白空格,将所有的名称都换为小写,并且将其余的空格都替换为下划线:
In [13]: df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_') In [14]: df Out[14]: column_a column_b 0 0.469112 -0.282863 1 -1.509059 -1.135632 2 1.212112 -0.173215
如果你有一个序列,里面有很多重复的值 (即,序列中唯一元素的数量远小于序列的长度),将原有序列转换为一种分类类型,然后使用.str. 或者 .dt.方法,则会获得更快的速度。 速度的差异来源于,在分类类型的序列中,字符操作只是在categories中完成的,而不是针对序列中的每一个元素。
请注意,相比于字符串类型的序列,带.categories类型的 分类 类别的 序列有一些限制(例如,你不能像其中的元素追加其他的字串:s + " " + s 将不能正确工作,如果s是一个分类类型的序列。并且,.str 中,那些可以对 列表(list) 类型的元素进行操作的方法,在分类序列中也无法使用。
警告
v.0.25.0版以前, .str访问器只会进行最基本的类型检查。 从v.0.25.0起,序列的类型会被自动推断出来,并且会更为激进地使用恰当的类型。
一般来说 .str 访问器只倾向于针对字符串类型工作。只有在个别的情况下,才能对非字符串类型工作,但是这也将会在未来的版本中被逐步修正
#拆分和替换字符串
类似split
的方法返回一个列表类型的序列:
In [15]: s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h']) In [16]: s2.str.split('_') Out[16]: 0 [a, b, c] 1 [c, d, e] 2 NaN 3 [f, g, h] dtype: object
切分后的列表中的元素可以通过 get
方法或者 []
方法进行读取:
In [17]: s2.str.split('_').str.get(1) Out[17]: 0 b 1 d 2 NaN 3 g dtype: object In [18]: s2.str.split('_').str[1] Out[18]: 0 b 1 d 2 NaN 3 g dtype: object
使用expand
方法可以轻易地将这种返回展开为一个数据表.
In [19]: s2.str.split('_', expand=True) Out[19]: 0 1 2 0 a b c 1 c d e 2 NaN NaN NaN 3 f g h
Pandas 可视化
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt # 创建一个画布 fig, ax = plt.subplots(figsize=(10, 5)) # 绘制广州各类天气条形图 ax.bar(df3['新天气'], df3['天数'], width=0.4, label='广州') # 绘制湛江各类天气条形图 ax.bar(df4['新天气'], df4['天数'], width=0.4, label='湛江', alpha=0.7) # 设置图例 ax.legend() # 设置 x 轴标签和标题 ax.set_xlabel('天气类型') ax.set_ylabel('天数') ax.set_title('广州和湛江各类天气天数对比') # 显示图表 plt.show()
In [6]: df = pd.DataFrame(np.random.randn(1000, 4), ...: index=ts.index, columns=list('ABCD')) ...: In [7]: df = df.cumsum() In [8]: plt.figure(); In [9]: df.plot();
In [10]: df3 = pd.DataFrame(np.random.randn(1000, 2), columns=['B', 'C']).cumsum() In [11]: df3['A'] = pd.Series(list(range(len(df)))) In [12]: df3.plot(x='A', y='B') Out[12]: <matplotlib.axes._subplots.AxesSubplot at 0x7f65d97c1668>
In [20]: df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) In [21]: df2.plot.bar();
In [24]: df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), ....: 'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c']) ....: In [25]: plt.figure(); In [26]: df4.plot.hist(alpha=0.5) Out[26]: <matplotlib.axes._subplots.AxesSubplot at 0x7f65da345e48>
以上就是pandas的功能,期待博主下一篇文章吧