merge函数
merge(df1,df2,on='key',how=' 附录一',suffixes=())
附录一:
left:左外连接
right:右外连接
inner:内连接
outer:外连接
区别:内连接只有两个key一样时才会出现在最后的结果中,左外连接可以出现左边(df1)里面所有拥有的key值,(右连接一样),外链接则是左连接和右连接的组合,最后的结果包含df1和df2的所有值
代码:
import pandas as pd
df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
print(pd.merge(df1,df2,how='outer'))
print(pd.merge(df1,df2,how='inner'))
print(pd.merge(df1,df2,how='right'))
运行结果为:
如果是两个DataFrame的标签不一样,则需要用left_on和right_on
代码如下:
df4=pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df5=pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
print(pd.merge(df4,df5,left_on='lkey',right_on='rkey',how='inner'))
print(pd.merge(df4,df5,left_on='lkey',right_on='rkey',how='outer'))
print(pd.merge(df4,df5,left_on='lkey',right_on='rkey',how='left'))
运行结果为:
suffixes=('str1','str2')
用于追加到重叠列名单末尾,我认为(‘_x’,'_y')。例如,如果左右两个DataFrame对象都有“data”,则结果中就会出现“data_x”和“data_y”,我们可以将其改成任意的后缀,比如说“_left”和“_right”
如果想在索引上面合并,则需要用到
left_index=True和right_index=True
以说明索引应该被用作连接键
轴向连接
concatenation
用于numpy数组,例如:
arr=np.arange(12).reshape(3,4)
print(np.concatenate([arr,arr],axis=1))
concat
concat函数可以合并Series和DataFrame
具体参数及其意义:
join_axes:指定用于n-1条轴的索引,不执行并集/交集运算
keys:用于形成层次化索引各级别上的索引
ignore_index 不保留连接轴上的索引,产生一组新索引
ignore_index实现:
df6=pd.DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])
df7=pd.DataFrame(np.random.randn(2,3),columns=['b','d','a'])
print(pd.concat([df6,df7],ignore_index=True))
print(pd.concat([df6,df7]))
运行结果
合并重叠数据
a.combine_first(b):用b的数据填充a的空数据
b.combine_first(a):用a的数据填充b的空数据
重塑和轴向旋转
stack:将数据的列旋转成行
unstack:将数据的行旋转成列
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
print(df2)
print("---------------")
print(df2.stack())
将长格式转换为宽格式
pivot函数
函数原型:
参数说明:
- index 指明哪个列变为新DataFrame的index,注意是哪个,而不是哪些;
- columns 指明哪个列变为columns;
- values 指明哪些列变为新DataFrame的数据域,如果不指明,则默认除了被指明index和columns的其他列。
例如:
ldata.pivot('date','item','value')
数据转换
移除重复数据
函数:drop_duplicates():返回一个移除了重复航的DataFrame
data=pd.DataFrame({'k1':['one','one','one','two','two','two','two'],'k2':[1,1,2,3,3,4,4]})
print(data)
print("---------------")
print(data.drop_duplicates())
运行结果图:
利用函数和映射进行数据处理
例如,这里有一个DataFrame,和一个映射关系,然后需要将这个映射关系加入到这个DataFrame中,我们就需要用到一个函数:map(),让我们看一下这个函数的具体用法例子
data1=pd.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_food={'bacon':'pig','pulled pork':'pig','pastrami':'cow','corned beef':'cow','honey ham':'pig','nova lox':'salmon'}
data1['animals']=data1['food'].map(str.lower).map(meat_to_food)
print(data1)
其中,str.lower将其转换成小写是因为我们的映射函数全都是小写,data1是大写,假设说,两者都是小写,那就可以不用这个,即
data1=pd.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_food={'bacon':'pig','pulled pork':'pig','pastrami':'cow','corned beef':'cow','honey ham':'pig','nova lox':'salmon'}
data1['animals']=data1['food'].map(meat_to_food)
print(data1)
两者的运行结果都为:
替换
替换主要使用函数 replace
次函数有以下几种用法:
data.replace(-999,np.nan)
data.replace([-999,1000],[np.nan,0])
data.replace({-999:np.nan,1000:0})
重命名轴索引
data1.index=data1.index.map(str.upper)
print(data1)
data1.rename(index={'THREE':'TEN'},inplace=True)
print(data1)
map(str.upper):代表将其变成大写
data1.rename(index={'THREE':'TEN'},inplace=True),首先,在函数里面需要有index={'THREE':'TEN'}或者columns=,表示修改行索引还是列索引,inplace=True表示就地修改
离散化和面元划分
所用函数:
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,labels=['young','youngadult','middleaged','senior'])
print(cats)
如果向cut传入的面元的数量而不是确切的面元边界,则他会根据最小值和最大值来计算等长的面元。以下为例子:
cats2=pd.cut(ages,4,precision=2)
print(cats2)
其中,4表示分成4块,precision=2表示精度为2,即保留两位有效数字
qcut():可以根据样本分位数对数据进行面元划分。根据数据的分布情况,cut可能无法使各个面元含有相同的数量的数据点。而qcut可以。
代码为:
cats2=pd.qcut(ages,4)
print(cats2)
计算指标/哑变量
函数:get_dummies()
他的作用是:将括号内的东西当作该DataFrame的列索引
df8=pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
print(df8)
print(pd.get_dummies(df8['key']))
运行结果为:
例子:
values=np.random.rand(10)
bins=[0,0.2,0.4,0.6,0.8,1]
print(pd.get_dummies(pd.cut(values,bins)))
运行结果:
字符串操作
split的进阶模式:可以去掉空格
代码如下:
val="a,b, guido"
pieces=[x.strip() for x in val.split(",")]
print(pieces)
x.strip():用于修剪空白符(包括换行符)
print('::'.join(pieces))
正则表达式
正则表达式提供了有一种灵活的在文本中搜索或匹配字符串的方法。
代码为:
import re
text="foo bar\t baz \tqux"
print(re.split('\s+',text))
运行结果:
有一个可以编译可复用对象的指令,为:compile()例如:
reuse=re.compile('\s+')
print(reuse.split(text))
在一个代码多次复用一条正则表达式的时候,可以使用该指令,以减少cpu的工作时间。
完整代码:
import numpy as np
import pandas as pd
import re
df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
#print(df1)
#print(df2)
df3=pd.merge(df2,df1,on='key')
#print(df3)
df4=pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df5=pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
#print(pd.merge(df1,df2,how='outer'))
#print(pd.merge(df1,df2,how='inner'))
#print(pd.merge(df1,df2,how='right'))
left=pd.DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})
right=pd.DataFrame({'group_val':[3.5,7]},index=['a','b'])
#print(pd.merge(left,right,left_on='key',right_index=True))
arr=np.arange(12).reshape(3,4)
#print(np.concatenate([arr,arr],axis=1))
df6=pd.DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])
df7=pd.DataFrame(np.random.randn(2,3),columns=['b','d','a'])
#print(pd.concat([df6,df7],ignore_index=True))
#print(pd.concat([df6,df7]))
#print(df2)
#print("---------------")
#print(df2.stack())
data=pd.DataFrame({'k1':['one','one','one','two','two','two','two'],'k2':[1,1,2,3,3,4,4]})
#print(data)
#print("---------------")
#print(data.drop_duplicates())
data1=pd.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]},index={'one','two','three','four','five','six','seven','eight','nine'})
meat_to_food={'bacon':'pig','pulled pork':'pig','pastrami':'cow','corned beef':'cow','honey ham':'pig','nova lox':'salmon'}
data1['animals']=data1['food'].map(meat_to_food)
#print(data1)
data1.index=data1.index.map(str.upper)
data1.rename(index={'THREE':'TEN'},inplace=True,)
#print(data1)
ages=[20,22,25,27,21,23,37,31,61,45,41,32]
bins=[18,25,35,60,100]
cats=pd.cut(ages,bins,labels=['young','youngadult','middleaged','senior'])
#print(cats)
cats2=pd.cut(ages,4,precision=2)
#print(cats2)
df8=pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
#print(df8)
#print(pd.get_dummies(df8['key']))
values=np.random.rand(10)
bins=[0,0.2,0.4,0.6,0.8,1]
#print(pd.get_dummies(pd.cut(values,bins)))
val="a,b, guido"
pieces=[x.strip() for x in val.split(",")]
#print(pieces)
#print('::'.join(pieces))
#print(val.count(','))
text="foo bar\t baz \tqux"
#print(re.split('\s+',text))
reuse=re.compile('\s+')
#print(reuse.split(text))
text2="Dave dave@google.com " \
"Steven steven@gmalil.com"
patten=r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'
regex=re.compile(patten,flags=re.IGNORECASE)
print(regex.findall(text2))