pandas对象中的数据可以通过一些内置的方式进行合并:
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
2,如果传入axis=1,则在列上面工作,最终产生一个DataFrame
3,concat函数的join=inner参数取两个连结的交集
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
#匿名函数结果同上
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