python科学计算笔记(十四)pandas数据过滤、清理、转换
来源:互联网 发布:linux php打开下载 编辑:程序博客网 时间:2024/06/10 23:16
本篇博客主要内容
1)移除重复数据(duplicated)
2)利用函数或映射进行数据转换(map)
3)替换值(replace)
4)重命名轴索引
5)检测和过滤异常值(逻辑索引)
6)随机采样或选出随机子集
7)计算哑变量(get_dummies)
1)移除重复数据
检查某列数据是否重复可用.is_unique
检查某行数据是否重复可用.duplicated
import pandas as pdimport numpy as npdata = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4,'k2':[1,1,2,3,3,4,4]})
data
检查列以及行中重复数据
data.index.is_unique#检查列
True
data.k1.is_unique#检查列
False
data['k2'].is_unique#检查列
False
data.is_unique
---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-12-3c5fb82b7563> in <module>()----> 1 data.is_uniqueC:\Program Files\anaconda\lib\site-packages\pandas\core\generic.pyc in __getattr__(self, name) 2670 if name in self._info_axis: 2671 return self[name]-> 2672 return object.__getattribute__(self, name) 2673 2674 def __setattr__(self, name, value):AttributeError: 'DataFrame' object has no attribute 'is_unique'
data.duplicated()#检查行
0 False 1 True 2 False 3 False 4 True 5 False 6 True dtype: bool
移除重复行
data.drop_duplicates()
set(data.k1)#保留唯一的列属性值
{'one', 'two'}
移除重复值小结
1) drop_duplicates、duolicated函数只能用于DataFrame
2) is_unique不能用于DataFrame
2)利用函数或映射进行数据转换
data1 = pd.DataFrame({'food':['bacon','pork','bacon','Pastrami',\ 'beef','Bacon','pastrami','ham','lox'],\ 'ounces':[4,3,12,6,7.5,8,3,5,6]})data1
添加一列表示肉类来源的动物类型
#step1:构建肉类到动物的映射meat_to_animal = {'bacon':'pig','pork':'pig','pastrami':'cow','beef':'cow','ham':'pig',\ 'lox':'salmon'}
Series的map方法可以接受一个函数或含有映射关系的字典型对象,字符的大小写要一致
#step2:映射data1['animal'] = data1['food'].map(str.lower).map(meat_to_animal)data1
#step2的另一种实现方法data1['food'].map(lambda x:meat_to_animal[x.lower()])
0 pig 1 pig 2 pig 3 cow 4 cow 5 pig 6 cow 7 pig 8 salmon Name: food, dtype: object
data1
map是一种实现元素级转换记忆其他数据清理工作的便捷方式
map会改变原始数据集
3)替换值
替换缺失值的方法:
1)fillna
2)含有重复索引的合并combine_first
3)replace
data2 = pd.Series([1.,-999,2,-999,-1000,3.])data2
0 1.0 1 -999.0 2 2.0 3 -999.0 4 -1000.0 5 3.0 dtype: float64
-999可能是一个表示缺失数据的标记值,要将其替换为pandas能够理解的NA值,可以利用replace
data2.replace(-999,np.nan)
0 1.0 1 NaN 2 2.0 3 NaN 4 -1000.0 5 3.0 dtype: float64
data2
0 1.0 1 -999.0 2 2.0 3 -999.0 4 -1000.0 5 3.0 dtype: float64
replace不改变原数据集
一次性替换多个值
data2.replace([-999,-1000],np.nan)#一次传入一个列表即可
0 1.0 1 NaN 2 2.0 3 NaN 4 NaN 5 3.0 dtype: float64
data2.replace([-999,-1000],[np.nan,0])
0 1.0 1 NaN 2 2.0 3 NaN 4 0.0 5 3.0 dtype: float64
data2.replace({-999:np.nan,-1000:0})
0 1.0 1 NaN 2 2.0 3 NaN 4 0.0 5 3.0 dtype: float64
4)重命名轴索引
跟Series中的值一样,轴标签也可以通过函数或映射进行转换,从而得到一个新对象,轴还可以被就地修改,而无需新建一个数据结构
data3 = pd.DataFrame(np.arange(12).reshape(3,4),index = ['a','b','c'],columns = ['one','two','three','four'])
data3
data3.index.map(str.upper)
array(['A', 'B', 'C'], dtype=object)
data3
data3.index = data3.index.map(str.upper)#修改了
data3
还可以通过rename结合字典型对象实现对部分轴标签的更新
data3.rename(index = {'A':'aaa'},columns = {'three':'liu'})
data3#不改变原数据
data3 = data3.rename(index = {'A':'aaa'},columns = {'three':'liu'})
data3
5)检测和过滤异常值
这里的异常值的阈值已知,因此,异常值的过滤或变换运算很大程度上其实就是逻辑数组运算。
data4 = pd.DataFrame(np.random.randn(1000,4))
data4.info()
data4.describe()
找出某列绝对值大于3的值
data4[3][np.abs(data4[3]) > 3]
189 -3.421995 335 3.086376 590 -3.388477 778 -3.100379 Name: 3, dtype: float64
找出全部或含有“超过3或-3的值”的行
(np.abs(data4) > 3).any(1).head()
0 False 1 False 2 False 3 False 4 False dtype: bool
data4[(np.abs(data4) > 3).any(1)]
替换异常值
data4[np.abs(data4) > 3] = np.sign(data) * 3
data4.isnull().sum()#有空值
0 3 1 4 2 4 3 4 dtype: int64
data4 = data4.replace(np.nan,0)
data4.isnull().sum()#无空值
0 0 1 0 2 0 3 0 dtype: int64
data4.describe()###?????????
6)排列和随机采样
1)numpy.random.permutation函数
2)np.random.randint生成随机数
df = pd.DataFrame(np.arange(5 *4).reshape(5,4))sampler = np.random.permutation(5)
df
sampler
array([0, 1, 3, 4, 2])
df.ix[sampler]
df.take(sampler)
通过np.random.randint得到一组随机整数
sampler1 = np.random.randint(0,len(df),size = 4)
sampler1
array([2, 2, 3, 0])
df1 = df.take(sampler1)
- 1
df1
7)计算指标/哑变量
将分类变量(categorical variable)转换为(哑变量矩阵,dummy matrix)或(指标矩阵,indicator matrix)是常用于统计学习建模或机器学习的转换方式。
即 DataFrame的某一列中含有k个不同的值,则可以派生出一个k列矩阵或DataFrame(其值为1或0)。
pandas中的get_dummies函数可以实现以上功能
df2 = pd.DataFrame({'key':['b','a','b','c','a','b'],'data1':range(6)})df2
pd.get_dummies(df2.key)
pd.get_dummies(df2['key'],prefix = 'key')
## get_dummies矩阵和原数据连接dummies = pd.get_dummies(df2['key'],prefix = 'key')pd.concat([df2['data1'],dummies],axis = 1)
df2[['data1']].join(dummies)#Series没有join
df2[['data1']]#选出的是DataFrame
df2['data1']#选出的是Series
0 01 12 23 34 45 5Name: data1, dtype: int64
- python科学计算笔记(十四)pandas数据过滤、清理、转换
- python+数据过滤、清理、转换
- python科学计算笔记(四)pandas 数据索引与选取
- python科学计算笔记(八)pandas大数据HDF5硬盘操作方式
- python科学计算笔记(九)pandas中DataFrame数据操作函数
- python科学计算笔记(十三)pandas的merge、concat合并数据集
- python科学计算笔记(二)pandas获取网络文件
- python科学计算笔记(五)pandas 时间序列resample
- python科学计算笔记(六)pandas 分组groupby
- python科学计算笔记(七)pandas透视表 pivot_table
- python科学计算笔记(十二)pandas的resample采样
- python科学计算一:pandas
- python科学计算四:pandas
- python/pandas数据分析(十三)-数据清理、转换、合并,重塑
- python科学计算笔记(三)pandas中Series和DataFrame练习
- python科学计算笔记(十)pandas中时间、日期以及时间序列处理
- python科学计算笔记(十一)pandas中date_range生成指定日期
- python 科学计算库 - Numpy,Scipy,Pandas
- spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict
- [leetcode]126. Word LadderII@Java解题报告
- MongoDB简介
- jq 控制select控件
- linux下安装vsftpd服务器
- python科学计算笔记(十四)pandas数据过滤、清理、转换
- MySQL使用INSERT插入多条记录, 批量新增数据
- Spring 中 AOP 思想实例解析
- 关于java的面向对象
- Shell排序和插入排序
- Python多线程
- vimgrep 用法
- Java获取当前工程的根目录
- IO多路复用之poll函数详解