本章介绍pandas的重要功能,只记录一些重点内容
1、重新索引
pandas对象的一个重要方法是reindex,其作用是创建一个适应用新索引的新对象
#重新索引 obj = pd.Series([4.5, 7.2, -5.3, 3.6], index = [‘d‘, ‘b‘, ‘a‘, ‘c‘]) obj #调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值 obj2 = obj.reindex([‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘]) obj2 obj.reindex([‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘], fill_value = 0) #对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到些目标 #使用ffill实现前向值填充 obj3 = pd.Series([‘blue‘, ‘purple‘, ‘yellow‘], index = [0, 2, 4]) obj3.reindex(range(6), method = ‘ffill‘) #reindex的(插值)method选项 #ffill 或 pad 前向填充值; bfill 或 backfill 后向填充值 obj2.ix[[‘a‘]]
输出结果
obj = pd.Series([4.5, 7.2, -5.3, 3.6], index = [‘d‘, ‘b‘, ‘a‘, ‘c‘]) obj Out[15]: d 4.5 b 7.2 a -5.3 c 3.6 dtype: float64 obj2 = obj.reindex([‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘]) obj2 Out[17]: a -5.3 b 7.2 c 3.6 d 4.5 e NaN dtype: float64 obj.reindex([‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘], fill_value = 0) Out[18]: a -5.3 b 7.2 c 3.6 d 4.5 e 0.0 dtype: float64 obj3 = pd.Series([‘blue‘, ‘purple‘, ‘yellow‘], index = [0, 2, 4]) obj3.reindex(range(6), method = ‘ffill‘) Out[20]: 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow dtype: object obj2.ix[[‘a‘]] Out[21]: a -5.3 dtype: float64
reindex函数的参数
2、丢弃指定轴上的项
丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。
drop方法返回的是一个在指定轴上删除了指定值的新对象
#定义一个数组,索引为 [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘] obj = pd.Series(np.arange(5.), index = [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘]) obj new_obj = obj.drop(‘c‘) new_obj obj.drop([‘d‘, ‘c‘]) #对DataFrame, 可以删除任意轴上的索引值
3、索引、选取和过滤
为了在DataFrame的行上进行标签索引,引入专门的索引字段ix,可以通过NumPy式的标记法以及轴标签从DataFrame中选取行和列的子集。
#为了在DataFrame的行上进行标签索引,引入专门的索引字段ix,可以通过NumPy式的标记法以及轴标签从DataFrame中选取行和列的子集。data = pd.DataFrame(np.arange(16).reshape((4, 4)), \ index = [‘Ohio‘, ‘Colorado‘, ‘Utah‘, ‘New York‘], \ columns = [‘one‘, ‘two‘, ‘three‘, ‘four‘])data data.ix[‘Colorado‘, [‘two‘, ‘three‘]]data.ix[[‘Colorado‘, ‘Utah‘], [3, 0, 1]]#3,0,1代表列标识data.ix[2]#第2行data.ix[:‘Utah‘, ‘two‘]data.ix[data.three>5, :3]
注意:在设计pandas时, 我觉得必须输入frame[:, col]才能选取列实在有些啰嗦,而且还很容易出错,因为列的选取是一种最常见的操作
于是,我就把所有的标签索引功能都放在ix中了
DataFrame的索引选项
4、算术运算和数据对齐
pd最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集
#算术运算和数据对齐 s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index = [‘a‘, ‘c‘, ‘d‘, ‘e‘]) s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index = [‘a‘, ‘c‘, ‘e‘, ‘f‘, ‘g‘]) s1, s2 s1 + s2 #list(‘bcd‘),相当于列元素,b, c, d df1 = pd.DataFrame(np.arange(9).reshape((3, 3)), columns = list(‘bcd‘), index = [‘Ohio‘, ‘Texas‘, ‘Colorado‘]) df2 = pd.DataFrame(np.arange(12).reshape((4, 3)), columns = list(‘bde‘), index = [‘Utah‘, ‘Ohio‘, ‘Texas‘, ‘Oregon‘]) df1, df2 df1 + df2 #在算术方法中填充值 df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), columns = list(‘abcd‘)) df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), columns = list(‘abcde‘)) df1 df2 #将它们相加时,没有重叠的位置会产生Na df1 + df2 #使用df1的add方法,传入df2以及一个fill_value参数 df1.add(df2, fill_value = 0) #在对Series或DataFrame重新索引时,也可以指定一个填充值 df1.reindex(columns = df2.columns, fill_value = 0)
灵活的算术方法
5、DataFrame和Series之间的运算
#DataFrame和Series之间的运算 arr = np.arange(12.).reshape((3, 4)) arr arr[0] arr - arr[0] #以上叫做广播 #DataFrame和Series之间的运算示例 frame = pd.DataFrame(np.arange(12).reshape((4, 3)), columns = list(‘bde‘), index = [‘Utah‘, ‘Ohio‘, ‘Texas‘, ‘Oregon‘]) #选取标识为0的行,即第一行 series = frame.ix[0] frame series #默认情况下,DataFrame和Series之间的运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播 frame - series #如果找不到,则参与运算的两个对象就会被重新索引以形成并集 series2 = pd.Series(range(3), index = list(‘bef‘)) series2 frame + series2
6、函数应用与映射
#函数应用和映射 frame = pd.DataFrame(np.random.randn(4, 3), columns = list(‘bde‘), index = [‘Utah‘, ‘Ohio‘, ‘Texas‘, ‘Oregon‘]) frame np.abs(frame) #另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现功能 #x为输入值,x.max() - x.min()为输出值 f = lambda x: x.max() - x.min() #输入列最大减最小 frame.apply(f) #输入行最大减最小 frame.apply(f, axis = 1)
许多最为常见的数组都被实现 成DataFrame方法,如sum和mean,因此无需使用apply方法
除标量值外,传递给apply的函数还可以返回由多个值 组成的Series
def f(x): return pd.Series([x.min(), x.max()], index = [‘min‘, ‘max‘]) #还是调用行frame.apply(f) frame.apply(f)Out[82]: b d emin -2.460592 -0.224366 -0.474713max 0.102727 0.183401 0.485874
#可以尝试一下调用列frame.apply(f, axis = 1)Out[83]: min maxUtah -1.158899 0.201939Ohio -0.162430 0.485874Texas -0.474713 -0.112733Oregon -2.460592 0.183401
#此外,元素级的python函数也是可以用的,假如你想得到frame中各个浮点值的格式化字符串,使用applymap即可 #输入元素x为两位小数的浮点字符 format = lambda x: ‘%.2f‘ % x frame.applymap(format)
format = lambda x: ‘%.2f‘ % x frame.applymap(format) Out[85]: b d e Utah -1.16 -0.22 0.20 Ohio 0.10 -0.16 0.49 Texas -0.22 -0.11 -0.47 Oregon -2.46 0.18 0.16
之所以中到applymap, 是因为Series有一个用于应用元素级函数的map方法:
#之所以中到applymap, 是因为Series有一个用于应用元素级函数的map方法:#指定e列 frame[‘e‘].map(format)Out[86]: Utah 0.20Ohio 0.49Texas -0.47Oregon 0.16Name: e, dtype: object
7、排序与排名
时间: 2024-09-28 16:17:18