4 pandas基本功能
4.2 数据选择
pandas的数据选择是十分重要的一个操作,它的操作与数组类似,但是pandas的数据选择与数组不同。当选择标签作为索引,会选择数据尾部,当为整数索引,则不包括尾部。例如列表a[0, 1, 2, 3, 4]中,a[1:3]的值为1,2;而pandas中为1,2,3。
数据选择的方法:1、直接选择;2、使用loc选择数据;3、使用iloc选择数据。
直接选择中,frame[[列名,列名]]表示选择列,frame[:3]表示选择行。
loc是根据轴标签进行选择,frame[行标签1,[列名,列名]]。
iloc是根据整数标签进行选择,frame[:1,[1,2]]选择第一行的第一、二列。
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.arange(16).reshape(4, 4),
index = ['Ohio', 'Colorado', 'Utah', 'New York'],
columns = ['one', 'two', 'three', 'four'])
print(frame)
print('直接选择(列):\n',frame[['one', 'two']]) #直接选择
print('直接选择(行):\n',frame[:2]) #直接选择
直接选择
print('使用loc进行选择:\n', frame.loc['Utah', ['two', 'three']]) #使用loc进行选择
print('使用loc进行选择:\n', frame.loc[:'Utah', ['two', 'three']]) #使用loc进行选择
print('使用iloc进行选择:\n', frame.iloc[[1, 3], [1, 3]]) #使用iloc选择数据
print('使用iloc进行选择:\n', frame.iloc[:, :3][frame.three > 5]) #使用iloc选择数据)
使用loc和iloc选择数据
DataFrame索引选项
类型 | 描述 |
---|---|
df[val] | 从DataFrame中选择单列或多列或行(整数表示选择行) |
df.loc[val] | 根据标签选择单行或多行 |
df.loc[:, val] | 根据标签选择单列或多列 |
df.loc[val1, val2] | 根据标签同时选中行和列的一部分 |
df.iloc[where] | 根据整数选择一行或多行 |
df.iloc[:, where] | 根据整数选择一列或多列 |
df.iloc[where_i, where_i] | 根据整数选择行和列 |
df.at[label_i, label_i] | 根据行列的标签位置选择单个标量值 |
df.iat[i, j] | 根据行列的整数位置选择单个标量值 |
reindex方法 | 通过标签选择行和列 |
get_value, set_value方法 | 根据行和列的标签设置单个值 |
灵活运用前9个方法对后续批量数据清洗和处理有很大的帮助。
4.3 对象的相加和使用填充值算法
不同对象(Series和DataFrame)之间的算术行为是pandas提供的一项重要功能。在pandas库的简单介绍(1)已经介绍过Series对象相加的例子,这里说明一下DataFrame对象的加减。
frame1 = pd.DataFrame(np.arange(12).reshape((3, 4)),
columns = list('abcd'))
frame2 = pd.DataFrame(np.arange(20).reshape((4, 5)),
columns = list('abcde'))
print('frame1:\n', frame1)
print('frame2:\n', frame2)
frame1+frame2
由上可知,DataFrame对象的加法与Series加法类似,如果有一个为缺失值,结果就是缺失值。
frame1通过利用add方法,将f2和fill_value作为参数传入:
frame1.add(frame2, fill_value = 0)
可以看出fill_value将缺失值的一方作为0处理。
同样的,也可以在重建索引指定填充值。
frame1.reindex(columns = frame2.columns, fill_value = 0)
重建索引后的frame1
4.4 函数应用和映射
函数应用可以对全部数据或某一列、某一行进行操作。
Numpy的通用函数(逐元素数组方法)对pandas对象也有效。
frame = pd.DataFrame(np.random.randn(4, 3), columns = list('abc'),
index = ['Ohio', 'Colorado', 'Utah', 'New York'])
print(frame)
np.abs(frame) #使用了np的abs(绝对值)方法
另外一个常用操作是将函数应用到一行或一列的一维数组上,DataFrame的apply方法可以实现这个功能,是个很有用的方法。
f = lambda x: x.max() - x.min()
print('行上计算:\n', frame.apply(f)) #默认在行上进行计算
frame.apply(f, axis = 'columns') #传入columns在列上计算
利用apply不仅可以返回标量值,也可以返回Series对象。
def f(x):
return pd.Series([x.min(), x.max(), x.mean(), x.max()-x.min()], index = ['最小值', '最大值', '平均值', '极差'])
frame.apply(f)
4.5 排序
排序时对数据集的重要操作,有时候我们把数据输出到excel并要求排序,我们就需要用到该操作。
Series对象用sort_index排序;而DataFrame利用sort_index方法和sort_values方法排序,sort_index根据索引进行排序,sort_values根据值排序。
在sort_index中,可以传入axis参数和ascending参数进行排序,默认按索引升序排序,当为frame1.sort_index(axis=1, ascending=False)表示在列上降序排列。
frame1 = pd.DataFrame(np.arange(8).reshape((2, 4)),
index = ['three', 'one'],
columns = ['a', 'c', 'd', 'b'])
print('frame1:\n', frame1)
print('\n默认排序:\n', frame1.sort_index())
print('\n按照列排序且降序:\n', frame1.sort_index(axis = 1, ascending = False))
print('\n按照值排序:\n', frame1.sort_values(by = ['a', 'b']))