5-Pandas数据处理
处理缺失数据
- None
- None是Python自带的,其类型为python object。因此,None不能参与到任何计算中
- np.nan(NaN)
- np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN
- object类型相比于int类型运算时消耗时间更长
- %timeit np.arange(1e5, dtype=object)
- %timeit np.arange(1e5, dtype=int)
- pandas中的None与NaN
- pandas中None与np.nan都视作np.nan
- pandas中None与np.nan的操作
- 判断函数
- df.isnull()
- 是否为空
- df.notnull()
- 是否不为空
- df.isnull().any()
- 默认判断某一列的值
- 有一个为True则为True,类似or
- 某列是否存在空值
- df.isnull().all()
- 默认判断某一列的值
- 全为True才为True,类似and
- 某列是否全部为空
- df.notnull().all(axis=1)
- 判断某一行的值
- df[df.notnull().all(axis=1)]
- 获取全不为空的行,进行过滤
- df.isnull()
- 过滤函数
- dropna()
- 可以选择过滤的是行还是列(默认为行)
- df.dropna()
- 默认删除有空的行
- df.dropna(axis=1)
- 删除有空的列
- 也可以选择过滤的方式 how = 'all'
- dropna()
- how默认是any
- df.dropna(how='all')
- 某行或列的值都为空的才删除
- dropna()
- dropna()
- 填充函数
- fillna()
- df.fillna(value=9999)
- 填充指定值
- 加inplace=True,进行修改
- df.fillna(method='bfill')
- axis=0,列的后面=>下
- df.fillna(method='ffill')
- 上
- df.fillna(method='bfill',axis=1)
- 行的后面=>右
- df.fillna(method='ffill',axis=1)
- 左
- df.fillna(value=9999)
- fillna()
- 判断函数
数据处理
-
检测重复行
- 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
- df.duplicated()
- 检测是否为第二次出现
- df.duplicated(subset=['a','b','c'])
- 只对abc三列进行检测是否重复
-
删除重复行
- 使用drop_duplicates()函数删除重复的行
- df.drop_duplicates()
- df.drop_duplicates(subset=['a','b','c'])
- 过滤掉重复项
- cond = df.duplicated(subset=['a','b','c'])
- df.loc[~cond]
- 取反
- np.logical_not(cond)
-
映射
-
概述
- 映射的含义
- 创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
- 需要使用字典
- 包含三种操作
- replace()函数:替换元素
- map()函数:新建一列, 最重要
- rename()函数:替换索引
- 映射的含义
-
replace()函数:替换元素
- 使用replace()函数,对values进行替换操作
- df.replace({85:1000,12:3000})
- replace还经常用来替换NaN元素
- df.replace({np.nan:0})
- 使用replace()函数,对values进行替换操作
-
map()函数:新建一列(行也可以)
-
使用map()函数,由已有的列生成一个新列
- 适合处理某一单独的列
-
df2['政治'] = df2['语文'].map({84:100,11:100,78:100,24:100})
-
df2['政治'] = df2['语文'].map(lambda x:x*2)
-
def grade(x): if x<60: return '不及格' elif x<80: return '及格' else: return '优秀' df2['等级'] = df2['语文'].map(grade)
-
-
rename()函数:替换索引
- df3.rename(index={'张三':'Mr Zhang'})
- df3.rename({'张三':'Mr Zhang'})
- 默认修改行索引
- df3.rename(columns={'语文':'Language'})
- 修改列索引
- df3.rename({'数学':'Math'},axis=1)
- 修改列索引
-
-
异常值检测和过滤
- 使用describe()函数查看每一列的描述性统计量
- df.describe()
- df.std()
- 使用std()函数可以求得DataFrame对象每一列的标准差
- 借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
- cond = df['weight']<1000
- 对每一列应用筛选条件,去除标准差太大的数据
- df.loc[cond]
- 删除特定索引df.drop(labels, inplace = True)
- df22.drop('张三')
- 删除行
- df22.drop('语文',axis=1)
- 删除指定的列
- df22.drop('张三')
- unique():唯一,去重
- df22['语文'].unique()
- df.query:按条件查询
- df22.query('语文==24')
- df22.query('语文20 or 数学35')
- df22.query('语文20 | 数学63')
- df22.query('语文>=78')
- df22.query('语文 >= @score')
- 使用变量
- df22.query('语文 in @list1')
- 排序
- df22.sort_values('数学')
- 默认升序
- 按某列值排序
- 排的是行的顺序
- df22.sort_values('张三',axis=1)
- 按张三各科成绩从左往右升序
- 排的是列的顺序
- 按张三各科成绩从左往右升序
- df22.sort_values('语文',ascending=False)
- 降序
- df22.sort_values('数学')
- 使用describe()函数查看每一列的描述性统计量
-
抽样
- 使用.take()函数排序
- 可以借助np.random.permutation()函数随机排序
- 随机排列:打乱顺序
- np.random.permutation([1,2,3,4,5])
- df22.take([1,0,2,3])
- 行排序
- 指定行顺序
- 行排序
- df22.take([1,0,2,3,4],axis=1)
- 指定列顺序
- 模拟无放回抽样,不会拿到重复数据,依次拿去
- df22.take(np.random.permutation([0,1,2,3]))
- permutation打乱顺序,take按照指定顺序排列
- 模拟有放回抽样,取完一个之后,可能再次抽到相同的数据
- df22.take(np.random.randint(0,4,size=10))
- 使用.take()函数排序
-
数据聚合
- 概述
- 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值
- 数据分类处理
- 分组:先把数据分为几组
- 用函数处理:为不同组的数据应用不同的函数以转换数据
- 合并:把不同组得到的结果合并起来
- 数据分类处理的核心: groupby()函数
- df.groupby(by='color')
- 得到分组对象
- df.groupby(by='color').groups
- 得到分组情况
- df.groupby(by='color').sum()
- df.groupby(by='color').mean()
- 概述
-
高级数据聚合
- apply
- apply()里面可以跟自定义的函数,包括简单的求和函数以及复杂的特征间的差值函数等
- apply不能直接使用例如sum、max、min、’count‘等方法
- df.groupby('color')[['price']].apply(sum)
- transform
- transform() 里面不能跟自定义的特征交互函数
- 它只能对每一列进行计算,所以在groupby()之后,transform()之前是要指定要操作的列
- 如果与groupby()方法联合使用,需要对值进行去重
- df.groupby('color')[['price']].transform(sum)
- apply
-
用索引合并
- ddd1.merge(ddd2,left_index=True,right_index=True)
读取数据
- pd.read_csv('../data/SMSSpamCollection',sep='\t',header=None)
- df = pd.read_table('../data/SMSSpamCollection',header=None)