博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python数据分析库pandas ------ pandas 删除重复元素、用映射替换添加元素、重命名轴索引、离散化、异常值检测和过滤、排序...
阅读量:5169 次
发布时间:2019-06-13

本文共 4409 字,大约阅读时间需要 14 分钟。

 数据转换

 删除重复元素

  DataFrame对象的duplicated()函数可用来检测重复的行,返回元素为布尔型的Series对象。 每个元素对

应一行,如果该行与其他行重复(也就是说该行不是第一次出现),则元素为True; 如果跟前面不重复,则元

素就为False。

  返回元素为布尔值的Series对象用处很大,特别适用于过滤操作。通常,所有重复的行都需要从DataFrame

对象中删除。pandas库的drop_duplicates()函数实现了删除功能,该函数返回的是删除重复行后的DataFmme对

象。

 

1 dframe = pd.DataFrame({ 'color': ['white','white','red','red','white'],'value': [2,1,3,3,2]}) 2 print(dframe) 3 print(dframe.duplicated()) 4 # 返回元素为布尔值的Series对象用处很大,特别适用于过滤操作。 5 print( dframe[dframe.duplicated()]) 6 print(dframe.drop_duplicates()) 7 输出: 8    color  value 9 0  white      210 1  white      111 2    red      312 3    red      313 4  white      214 0    False15 1    False16 2    False17 3     True18 4     True19 dtype: bool20    color  value21 3    red      322 4  white      223    color  value24 0  white      225 1  white      126 2    red      3

 

 用映射替换元素

  要用新元素替换不正确的元素,需要定义一组映射关系。在映射关系中,旧元素作为键,新元素作为值。

  DataFrame对象中两种旧颜色被替换为正确的元素。还有一种常见情况,是把NaN替换为其他值,比如0。

这种情况下,仍然可以用replace()函数,它能优雅地完成该项操作。

1 frame8 = pd.DataFrame({ 2     'item': ['ball', 'mug', 'pen', 'pencil', 'ashtray'], 3     'color': ['white', 'rosso', 'verde', 'black', 'yellow'], 4     'price': [5.56, 4.20, 1.30, 0.56, 2.75] 5 }) 6 print(frame8) 7 newcolors = { 8     'rosso': 'red', 9     'verde': 'green'10 }11 print(frame8.replace(newcolors))12 13 ser = pd.Series([13, np.nan, 4, 6, np.nan, 3])14 print(ser.replace(np.nan, 0))

  输出结果:

  

 

 用映射添加元素

  下面只是部分功能的展示,详情请参考。

1 frame9  = pd.DataFrame({ 2     'item':['ball','mug','pen','pencil','ashtray'], 3     'color':['white','red','green','black','yellow'] 4 }) 5 print(frame9) 6 price = { 7     'ball' : 5.56, 8     'mug' : 4.20, 9     'bottle1' : 1.30,10     'scissors' : 3.41,11     'pen' : 1.30,12     'pencil' : 0.56,13     'ashtray' : 2.7514 }15 frame9['price'] = frame9['item'].map(price)  # 这里是按‘item’的对应关系添加16 print(frame9)

  输出结果:

  

  官方文档案例:

1 df = pd.DataFrame({2     'A': ['bat', 'foo', 'ibat'],3     'B': ['abc', 'bar', 'xyz']4 })5 # r'^ba.$'是匹配最后三个字符中前面量为ba的;$匹配结尾的6 print(df.replace(to_replace=r'^ba.$', value='new', regex=True))

  输出结果:(上面关于正则的知识点请)

  

 

 重命名轴索引

   对于只有单个元素要替换的最简单情况,可以对传入的参数做进一步限定,而无需把多个变 量都写出来,

也避免产生多次赋值操作。对于多个元素替换最好用字典先写好。

1 reindex = { 2     0:'first', 3     1:'second', 4     2:'third', 5     3:'fourth', 6     4:'fifth' 7 } 8 print(frame9.rename(reindex)) 9 recolumn ={10         'item':'object',11         'price':'value'12 }13 print(frame9.rename(index=reindex,columns=recolumn))  # 不会改变原数据frame914 print(frame9)15 print(frame9.rename(index={1:'first'},columns={
'item':'object'}))16 # inplace=True用于指定在原数据frame9上面改17 frame9.rename(index={1:'first'},columns={
'item':'object'},inplace=True)18 print(frame9)

  输出结果:

             

 

  离散化和面元划分

   每个面元的出现次数,即每个类别有多少个元素,可使用value_counts()函数。

   cut 是等差划分面元, qcut 是根据分位数划分面元。

1 ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32] 2 bins = [18, 25, 35, 60, 100] 3 # cut(x, bins, right=True, labels=None, retbins=False, precision=3, 4 #         include_lowest=False, duplicates='raise') 5 cat = pd.cut(ages, bins) 6 print(cat, "\n-----* 1 *-----\n") 7 # cat.codes 输出每个元素对应的面元编码 8 print(cat.codes, "\n-----* 2 *-----\n") 9 print(pd.value_counts(cat), "\n-----* 3 *-----\n")  # 查看每个面元中元素的数量10 cuts = pd.cut(ages, bins, right=False)  # 使用right=False可以修改开端和闭端11 print(cuts, "\n-----* 4 *-----\n")12 cut1 = pd.cut(ages, bins, right=False, labels=list('abcd'))13 print(cut1, "\n-----* 5 *-----\n")14 15 print(pd.cut(ages, 5), "\n-----* 6 *-----\n")  # 如果cut传入的是数字n,那么就会均分成n份。16 print(pd.value_counts(pd.cut(ages, 4)), "\n-----* 7 *-----\n")17 # qcut18 # qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')19 # 基于分位数的离散化函数。将变量离散成20 # 基于等级或基于样本分位数的相等大小的面元。21 print(pd.qcut(ages, 5), "\n-----* 8 *-----\n")22 print(pd.value_counts(pd.qcut(ages, 4)), "\n-----* 9 *-----\n")

 

  输出结果:

  

  

  

 

  异常值检测和过滤

  假设将比标准差大3倍的元素视作异常值。用std()函数就可以求得DataFrame对象每一列的标准差。

1 data = pd.DataFrame(np.random.randn(1000,3))2 print(data.describe())3 print(data.std())4 print(data[(np.abs(data)>(3*data.std())).any(1)])  # 过滤条件 any(1)只要有一个大于3*sigma就满足条件

  

 

 排序

1 nframe = pd.DataFrame(np.arange(25).reshape(5,5))2 new_order = np.random.permutation(5)  #乱序整数[0-4]  如果是100 [0-99]3 print(nframe.take(new_order))  #排序4 print(np.random.permutation(100))5 print(nframe.take([3,4,2]))  #只对一部分排序6 sample = np.random.randint(len(nframe),size =3)  #随机整数7 print(nframe.take(sample))

  输出结果:

  

 

转载于:https://www.cnblogs.com/dan-baishucaizi/p/9413165.html

你可能感兴趣的文章
Django(一)框架简介
查看>>
Python操作SQLite数据库的方法详解
查看>>
菜单和工具条(二)
查看>>
hadoop17---RPC和Socket的区别
查看>>
使用JMeter代理录制app测试脚本
查看>>
Linq to Object实现分页获取数据
查看>>
mac常用系统命令
查看>>
android上传文件到服务器
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>
Html - Table 表头固定和 tbody 设置 height 在IE不起作用的解决
查看>>
HDU 2262 回溯算法 递归枚举
查看>>
九度0J 1374 所有员工年龄排序
查看>>
微信小程序图片使用示例
查看>>
Ubuntu16.04+cuda8.0rc+opencv3.1.0+caffe+Theano+torch7搭建教程
查看>>
1.开发准备
查看>>
centos su命令
查看>>
CLR:基元类型、引用类型和值类型
查看>>
dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决...
查看>>
jQuery中的事件绑定的几种方式
查看>>
泥塑课
查看>>