Pandas数据去重和对重复数据分类、求和,得到未

2019-11-28 06:13 来源:未知

View Code

  3,去重

彩民之家论坛9066777 1

常用的不二秘籍

  • head()
    参数: 数字
    暗许查看前五行,不过加参数来退换查看的行数

  • tail()
    参数: 数字
    默许查看最终五行,能够加上参数内定查看的行数

  • describe()
    查阅数据的叙说消息,满含计数,均值,最大超级小值,布满

  • info()
    翻开数据的着力音信

  • sort_index()
    参数: axis, ascending
    按索引实行排序,暗中同意是安分守己0轴升序
    能够钦命参数来兑现是0/1轴,升降序

    df.sort_index()                    # 默认是0轴,升序
    df.sort_index(ascending=False)     # 指定0轴,降序
    
    df.sort_index(axis=1)              # 指定1轴,默认升序
    df.sort_index(axis=1, ascending=False)   # 指定1轴,降序
    
  • sort_values()
    参数: by, axis, ascending
    按值实行排序,暗中认可是0轴升序
    可以钦命参数来实现0/1轴,升降序
    其他,均供给额外钦命排序基准,即遵照什么值举办排序。

    df.sort_values(by='A')                    # 默认是0轴,升序,按照A列
    df.sort_values(ascending=False)     # 指定0轴,默认降序
    
    df.sort_values(axis=1)              # 指定1轴,升序
    df.sort_values(axis=1, ascending=False)   # 指定1轴,降序
    
  • reindex()
    参数:index/columns
    运用列表重新排列索引的风流罗曼蒂克生机勃勃,index是0轴趋势,columns是1轴样子

  • drop()
    参数: value/axis
    暗中认可意况下,删除的是行,可以钦赐axis=1来删除列
    内需小心的是,drop()重临的是叁个别本,即drop命令并不会一贯在原数据上改造。

    彩民之家论坛9066777 2

    image

  • rename()
    参数:index/columns
    对行或然列索引进行改良,以字典的款式,重要采纳于很少的更正
    当对多少个目录实行改换的时候,能够动用df.columns = [...]

  • value_counts()
    对现身的值进行计数
    本条格局只可以对塞里es类型举办计数,DataFrame类型你只须求先选择风姿洒脱行只怕一列不就改成Series了么。

  • 字符串方法
    对字符串进行拍卖,包涵大小写调换等等。
    一致只对Series有效,便是说,你需求先选择某后生可畏行仍然列,在动用那一个情势。

    彩民之家论坛9066777 3

    image

  • concat()
    其风华正茂措施是将多组Series或许DataFrame联结,能够钦点axis联结到行依旧列。
    私下认可合并到行

    彩民之家论坛9066777 4

    image

    下边是内定axis联结到列

    彩民之家论坛9066777 5

    image

  • merge()
    那是SQL类型的统少年老成

    彩民之家论坛9066777 6

    image

其中,on参数指定合并的基准列
  • append()
    在数量的前面扩充

    彩民之家论坛9066777 7

    image

  • groupby()
    分组操作

  • transform()
    对分组进行转移,不会进展全部的调换,每一种分组作为一个小的完整,上面包车型大巴事例是应用各类分组的中位数来对如今分组进行空值填充,并不是运用完全的中位数来展开填写。

    features['LotFrontage'] = features.groupby("Neighborhood")["LotFrontage"].transform(lambda x:x.fillna(x.median())) 
    
  • to_datetime()
    日子调换方法,将某一列调换来日期类型只怕将某叁个字符型的日期转变到日期格式。经过日期转变之后,便得以实施相应的日子操作。

    df['time'] = pd.to_datetime(df['time'])
    
    df['time'].dt.year  # 获取日期里面的年份
    df['time'].dt.mongth  # 获取月份 
    df['time'].dt.day  # 获取某一天
    df['time'].dt.weekday_name  # 获取星期几(英文)
    df['time'].dt.weekday   # 获取周几(数字)
    df['time'].dt.dayofyear  # 获取一年的第几天 
    
  • date_range()
    参数: 日期,periods
    创制日期类型的目录

    彩民之家论坛9066777 8

    image

  • DatetimeIndex()
    始建日期类型的目录

    time_index = pd.DatetimeIndex(df['time'])
    

    如上是将time这一列形成日期类型的目录,将其取名称叫time_index,值的注目标是,在这里处,并无需覆盖原本的index,可是依旧能够动用这么些日子类型的目录对本来的数额举办操作。

    time_index.year   # 获取年份
    time_index.month  # 获取月份
    
  • duplicated()
    翻开是或不是存在重新行,假如存在重复行,重临True,否则再次来到False。
    要是是对Series操作,则只对Series进行再一次行检查,纵然是对DataFrame操作,则是对整行举办反省。

    能够选用下边包车型大巴议程查看具体的重新行的数量。

    train.loc[train.duplicated(), :]
    

    参数keep钦赐重复行的保留情况,能够是'first','last', False,False是将全体再一次行列出。

    参数subset以一个列表的花样,能够内定仅对列表现身的行,进行重新检查,举个例子subset=['column1', 'column2'],意思是只对column1,column2进展再一次检查。

  • drop_duplicated()
    将DataFrame重复行举行删减,keep参数钦赐保留的行,'first', 'last'...

  • get_option()
    pandas的选项工具,上边是查看最大的显得行数。

    pd.get_option('display.max_rows')
    

    如上的主意展现最大突显的行数

  • set_option()
    pandas的选项设置函数
    上面是安装最大展现的行数为无,即全部出示。

    pd.set_option('display.max_rows', None)
    

彩民之家论坛9066777 9

  5,多层索引

  5.1 隐式构造,最常用的办法是给DataFrame布局函数的index或columns传递多个或多少个数组。

彩民之家论坛9066777 10

  5.2 显式布局,用pd.MultiIndex.from_product

彩民之家论坛9066777 11

  5.3 索引和切块

彩民之家论坛9066777 12

常用属性

  • dtype
    回到Series的数据类型

  • dtypes
    回来DataFrame每一列的数据类型

  • index
    回来0轴索引,能够动用list()将其改为列表方式

  • columns
    回去1轴索引,可以适应list将其成为列表类型

  • values
    返回值,是一个array类型

  • shape
    回来维度

  • T
    队列转置

彩民之家论坛9066777 13

  2,属性

彩民之家论坛9066777 14


  9 ,替换replace()

df.replace(to_replace=6,value='ww')   #把所有的6换成‘ww’df.replace(to_replace={2:6},value='ww')  #把列索引为‘2’这列中‘6’换成‘ww’df.replace(to_replace={2:6,3:9},value='ww')#把列索引为2中的6和列索引为3中的9换成‘ww’df.replace(to_replace={6:'ww'})   #把所有的6换成‘ww’df.replace(to_replace={6:'ww',1:'qq'})  #把所有的6换成‘ww’,把所有的1换成‘qq’
duplicate_data = dataset.loc[duplicate_row,:]
print(duplicate_data)

  4,加法

  索引相符的加在一同,当索引不均等的项,就用NaN填充

彩民之家论坛9066777 15

彩民之家论坛9066777 16彩民之家论坛9066777 17

  8,删除重复成分

  使用duplicated()函数检验重复的行,再次来到成分为bool类型的Series对象,keep参数:钦定保留哪豆蔻梢头行再一次的成分

彩民之家论坛9066777 18

  还足以应用drop_duplicates(),那也是drop种类函数。

彩民之家论坛9066777 19

View Code

  11,排序

  使用take()函数排序,take选用八个目录列表,用数字代表,使得df会依据列表中索引的各类实行排序

彩民之家论坛9066777 20

  还足以动用np.random.permutation()函数随机排序,它回到的是二个生龙活虎维的人身自由数组,比方参数为10,就能够发生0到9那十二个数字,不另行的,顺序照旧打乱的。

  当DataFrame规模充分大时,大家就足以借助它帮大家把数量打乱,然后用take函数达成自由取样

values = df.take(np.random.permutation,axis=0).take(np.random.permutation,axis=1).values
上面的代码是把1000行随机打乱,然后3列随机打乱DataFrame(data=values)这就会映射会原数据,此时的原数据就是行和列都打乱的数据

View Code

  4,数据清洗

  4.1 用isnull(),notnull,all()搭配使用,得到风度翩翩组bool值的Series,然后把它看做目录,就足以刷洗为False的行

彩民之家论坛9066777 21

  4.2 还能用drop(),drop系列的函数中,axis=1表示列,axis=0代表行,这和其余具有场景都以相反的

彩民之家论坛9066777 22

  4.3 下面二种清洗方式都以剔除整行可能,整列,有时是不允许那样子删除。笔者也得以用fillna()来把空值给填上。当inplace参数设为Ture时,表示改革后的数量映射到原数据,也正是改革原数据。

彩民之家论坛9066777 23

1、导入包:

  7,合并

合并用merge().它和数据库中的链表差不多merge和concat的区别在于,merge需要依据某一共同的列进行合并。在使用merge时,会自动根据两者相同的columns,来合并每一列元素不要求一致参数:how:out取并集,inner取交集on:当两者有多列的名字相同时,我们想指定某一列进行合并,那我们就要把想指定列的名字赋给它left_on和right_on:同时使用,当两者间没有共同的列名称时,可以分别指定

彩民之家论坛9066777 24

彩民之家论坛9066777 25

彩民之家论坛9066777 26

彩民之家论坛9066777 27

彩民之家论坛9066777 28彩民之家论坛9066777 29

  5,数据洗刷

  主要用isnull()判定值是或不是为空,notnull()决断值是还是不是不为空,重返的皆以值为bool型的Series,然后把它当作目录,就可以把为False的值给删除。

彩民之家论坛9066777 30

 

  13,高端聚合

  在分组后能够用sum等聚合函数,其次还足以跟transform和apply函数,再给那五个函数字传送叁个自定义函数,就足以是聚合函数以外的作用。

彩民之家论坛9066777 31

彩民之家论坛9066777 32

彩民之家论坛9066777 33

  10,映射

  10.1 用map()新建一列

彩民之家论坛9066777 34

  10.2 map()中还是能够跟自定义函数

彩民之家论坛9066777 35

人的非凡抱负往往和她的力量成正比。 —— Johnson

  2,索引和切成条

  2.1 列索引

彩民之家论坛9066777 36

  2.2 行索引

彩民之家论坛9066777 37

  2.3 成分索引

彩民之家论坛9066777 38

  2.4 切片

彩民之家论坛9066777 39

 

  1,DataFrame的创建

  最常用的主意是传递三个字典,以字典的key为列索引,以每三个key对应的值作为对应列的多少,所以值应该是个列表。仍然是能够钦点行索引,但不得以钦命列索引。

彩民之家论坛9066777 40

 彩民之家论坛9066777 41

  6,级联

pandas使用pd.concat(),与np.concatedate()类似,参数有些不同。参数join:'outer'将所有的项进行级联,'inner'只会把匹配的项进行级联。

彩民之家论坛9066777 42

  由于在这里后的级联的使用过多,因而有二个函数append特地用于在末端增加。

彩民之家论坛9066777 43

再然后基于'letter',' number '对再一次数据进行分拣,在该前提下并对重复数据的’label’实行求和,且重新初始化索引(对后文中的赋值操作有帮扶卡塔尔

  1,索引和切块

用中括号时,可以是显示索引,也可以是隐式索引用句点符‘.’用.loc[]时,只能有显示索引用.iloc[]时,只能用隐式索引

彩民之家论坛9066777 44彩民之家论坛9066777 45

  3,运算

  要作保行索引和列索引都平等才具运算,不然用NaN填充

彩民之家论坛9066777 46

View Code

  12,分类

  分类正是把数据分为多少个组,然后小编能够对各样组开展操作,那和数据库分类是相近的效果与利益。使用的是groupby()函数,参数by是分类的基于,groups属性能够查看分组处境

彩民之家论坛9066777 47

彩民之家论坛9066777 48彩民之家论坛9066777 49

  一、Series

  相像于一个人数组的目的,第1个参数为数量,第三个参数为索引(索引能够不钦定,就暗中同意用隐式索引卡塔 尔(阿拉伯语:قطر‎

Series(data=np.random.randint(1,50,(10,)))Series(data=[1,2,3],index=('a','b','c'))dic={'math':88,'chinese':99,'english':50}Series(data=dic)
对于data来说,可以是列表、np数组、字典,当用字典时,字典的key会成为行索引

重大利用多少个荦荦大者的函数:

  二、DataFrame

  DataFrame是二个表格型的数据构造,DataFrame由自然顺序排列的多列数据整合,设计初志是将Series的应用景况从大器晚成维展开到多维,DataFrame既有行索引index,也是有列索引columns,值values。

第一,利用duplicated()函数按列名'letter'和' number '取重复行,其归来的是bool类型,若为重复行则true,反之为false

View Code

duplicate_data _one= duplicate_data.drop_duplicates(subset=['letter',' number '] ,keep="first").reset_index(drop=True)
Print(duplicate_data)

彩民之家论坛9066777 50

duplicate_data _one ["label"] = duplicate_data_sum ['label']  #前面需要重置索引
print(duplicate_data_one)

 

彩民之家论坛9066777 51彩民之家论坛9066777 52

import pandas as pd
import numpy as np
data = {"number":[1,1,np.nan,np.nan,2,2,1,2,2],
        "letter":['a','b',np.nan,np.nan,'c','d','b','c','d'],
        "label":[1,1,9,9,2,2,1,2,2]}
dataset1 = pd.DataFrame(data) #初始化DataFrame 得到数据集dataset1
print(dataset1)

彩民之家论坛9066777 53

View Code

接下来经过bool值抽出重复行的数据

其实整个须求呢,正是难题。2018-08-16

彩民之家论坛9066777 54彩民之家论坛9066777 55

4、利用duplicated()函数和drop_duplicates()函数对数码去重

dataset = dataset1.fillna("NULL")
print(dataset)

 


 对drop_duplicates指定列:subset=['letter',' number '],保留第一条重复的数量:keep="first"

是因为数量集里含有空值,为了能够对后边重复数据实行求和,则供给对空值举办填空

View Code

彩民之家论坛9066777 56

DataFrame.drop_duplicates().reset_index(drop=True)

2、构造DataFrame,里面包涵三种数据类型:int、null、str 

赢得不重复的多寡,指定列subset=['letter',' number ',' label '],不保留重复数据:keep=False

彩民之家论坛9066777 57彩民之家论坛9066777 58

 

no_duplicate = dataset.drop_duplicates(subset=['letter',' number ',' label '] ,keep=False)
Print(no_duplicate)
duplicate_data_sum = duplicate_data.groupby(by=['letter',' number ']).agg({' label ':sum}).reset_index(drop=True)
Print(duplicate_data_sum)
Result = pd.concat([no_duplicate,duplicate_data _one])
Print(result)
 1 import pandas as pd
 2 import numpy as np
 3 
 4 #构造DataFrame
 5 data = {"number":[1,1,np.nan,np.nan,2,2,1,2,2],
 6         "letter":['a','b',np.nan,np.nan,'c','d','b','c','d'],
 7         "label":[1,1,9,9,2,2,1,2,2]}
 8 dataset1 = pd.DataFrame(data)
 9 
10 #空值填充
11 dataset = dataset1.fillna("NULL")
12 #得到重复行的索引
13 duplicate_row = dataset.duplicated(subset=['letter','number'],keep=False) 
14 #得到重复行的数据
15 duplicate_data = dataset.loc[duplicate_row,:]
16 #重复行按''label''求和
17 duplicate_data_sum = duplicate_data.groupby(by=['letter','number']).agg({'label':sum}).reset_index(drop=True)
18 
19 #得到唯一的重复数据
20 duplicate_data_one= duplicate_data.drop_duplicates(subset=[
21     'letter','number'],keep="first").reset_index(drop=True) 
22 #获得不重复的数据
23 no_duplicate = dataset.drop_duplicates(subset=['letter','number','label']
24                         ,keep=False)
25 #把重复行按"label"列求和的"label"列赋值给唯一的重复数据的"label"列
26 duplicate_data_one ["label"] = duplicate_data_sum ['label']
27 Result = pd.concat([no_duplicate,duplicate_data_one]

5、全部代码:

View Code

View Code

duplicate_row = dataset.duplicated(subset=['letter',' number '],keep=False) 
print(duplicate_row)

DataFrame.groupby().agg({})

 

彩民之家论坛9066777 59

 

3、空值填充

彩民之家论坛9066777 60

彩民之家论坛9066777 61彩民之家论坛9066777 62

View Code

自个儿处于学习中,如有写的非常不够标准可能失实的地点,诚心希望各位读者多多提出!!

DataFrame.duplicated()

彩民之家论坛9066777 63彩民之家论坛9066777 64

彩民之家论坛9066777 65彩民之家论坛9066777 66

取出双重数据中的几个,例如:1,1,2,2——>1,2

View Code

Pandas.concat()

须求的组织图:

最后,东挪西撮”新重复值中的几个”和不另行的多少

彩民之家论坛9066777 67

将对重复值的’label’求和,并赋值给“重复值中的三个”,获得新的”新重复值中的贰个

事关的包有:pandas、numpy

 

彩民之家论坛9066777 68彩民之家论坛9066777 69


版权声明:本文由彩民之家高手论坛发布于编程技术,转载请注明出处:Pandas数据去重和对重复数据分类、求和,得到未