pandas高阶

一,数据规整化-合并数据集

pandas对象中的数据可以通过一些内置的方式进行合并:

  • pandas.merge可以根据一个或多个键将不同DataFrame中的行连接起来
  • pandas.concat可以沿着一条轴将多个对象堆叠到一起
  • combine_first可以将重复数据编结在一起,用一个对象中的值填充另一个对象中的缺失值
    01->链接两个DataFrame的方法 pd.merge(df1,df2,on)
import pandas as pd
from pandas import DataFrame,Series
df1 = DataFrame({"key":list("bbacaab"),
                "data1":range(7)})
df2 = DataFrame({"key":list("abd"),
                "data2":range(3)})
pd.merge(df1,df2,on="key") 
# 不指定how,默认是内链接,将重叠列当做键,用on指定,取交集

02->两个对象列名不同,可分别进行指定

df3 = DataFrame({"lkey":list("bbacaab"),
                "data1":range(7)})

df4 = DataFrame({"rkey":list("abd"),
                "data2":range(3)})
pd.merge(df3,df4,left_on="lkey",right_on="rkey")  
# 不指定how,默认是内链接,取交集                

03->
pd.merge(df1,df2,how=”“)
how str
(1) inner 默认 内连结,取交集
(2) outer 外连结 取并集
(3) left 左连结 以df1为主”表”进行连结
(4) right 右连结 以df2为主”表”进行连结

pd.merge(df1,df2,how="outer")# 外连结,取并
pd.merge(df1,df2,how="left")# 左连结,右边只取有关联的值,没有关联的NAN值填充
pd.merge(df1,df2,how="right")#右连结,左边只取有关联的值,没有关联的NAN值填充

04->
1,对对象调用concat可以将值和索引粘合在一起,concat默认情况下axis=0,在行上面工作,最终产生一个Series
pandas高阶_第1张图片
2,如果传入axis=1,则在列上面工作,最终产生一个DataFrame
pandas高阶_第2张图片
3,concat函数的join=inner参数取两个连结的交集
pandas高阶_第3张图片
4,key传入一个列表创建层次索引

result= pd.concat([s1,s2,s3],key=['one','two','three'])

05->Series中combine_first实现重叠数据的对齐

a = Series([NA,2.5,NA,3.5,4.5,NA],index=list("fedcba")) 
b = Series(np.arange(len(a)),dtype=np.float64,index=list("fedcba"))
b[:-2].combine_first(a[2:])#b中取到倒数第三个,a中取第三个到最后

DataFrame中combine_first

df1.combine_first(df2)#df2为df1打补丁

二,数据规整化-重塑与轴向选择

01->重塑层次化索引
stack:将数据的列旋转为行
unstack:将数据的行旋转为列
对于一个层次化索引的Series,可以用unstack将其重排一个DataFrame

默认情况下,unstack(stack)操作的是最内层的,传入分层级别的编号或名称可对相应指定级别进行操作.

result.unstack(0)#将第一层行索引转化为列索引
result.unstack('行索引名称')#将指定行索引名称转化为列索引

在对DataFrame进行unstack操作时,作为旋转轴的级别将会成为结果中的最低级别

三,数据转换

DataFrame的duplicated方法,返回布尔型Series,表示各行是否是重复项,True表示为重复项,False表示不为重复项.

mask=data.duplicated()#查看数据是否为重复项
data[~mask]#取出所有非重复项

drop_duplicates方法用于返回一个移除了重复项的DataFrame.
方法后传入列名表示对指定项进行重复项判断:data.drop_duplicates([‘列名’])
duplicated,drop_duplicates默认保留第一个出现的值,传入keep=’last’,保留最后一个.

利用函数和映射进行转换

foods = DataFrame({"food":["bacon" , "pulled pork" , "bacon" , "Pastrami" , "corned beef" , "Bacon" , "pastrami" , "honey ham" , "nova lox"],
                    "ounces":[4,3,12,6,7.5,8,3,5,6]})
meat_to_animal = {"bacon":"pig",
                  "pulled pork":"pig",
                  "pastrami":"cow",
                 "corned beef":"cow",
                 "honey ham":"pig",
                 "nova lox":"salmon"}
foods
foods["Animal"] = foods["food"].map(str.lower).map(meat_to_animal)
foods

pandas高阶_第4张图片pandas高阶_第5张图片

#匿名函数结果同上
result = foods["food"].map(lambda x : meat_to_animal[x.lower()])
foods["Animal"] = result
foods

cut函数进行数据拆分:

ages = [20,22,25,27,21,23,37,31,61,45,41,32]  # 年龄样本数据
bins = [18,25,35,60,100]   # 划分区间
cats = pd.cut(ages,bins)
cats.codes   # 每个数据样本落在第几个区间,序号从0开始
# 对拆分后的数据进行统计
pd.value_counts(cats)
# 虽数据进行分组,并为每一组添加标签
group_names = ["Youth","YongAdult","middleAged","senior"]
newcats = pd.cut(ages,bins,labels=group_names)

pd.cut()将样本进行等间距分组
pd.cut(data,4,precision=2)#保留两位有效数字
pd.qcut(data,4)#按照四分位数进行切割
pd.value_counts()#计数
pd.qcut(data,[0,0.1,0.5,0.9,1.]) #自定义分位数
筛选出四列当中任意一列数据绝对值大于3的行数据
data[(np.abs(data)>3).any(1)]
np.sign(data).head(10) #获取数据的正负号 -1 负值 1 正数
将数据集中大于3或者小于-3的数赋值为3或者-3(符号由数据的符号决定)
data[np.abs(data)>3] = np.sign(data)*3

你可能感兴趣的:(pandas高阶)