一、合并数据集
代码
|
merge(
df1=DataFrame({
'key'
:[
'b'
,
'd'
,
'b'
,
'g'
,
'd'
,
'u'
,
'a'
],
'data1'
:range(7)})
df2=DataFrame({
'key'
:[
'b'
,
'd'
,
's'
],
'data2'
:range(3)})
df3=pd.merge(df1,df2)
#print(df3)
#
外连接,并集
print(pd.merge(df1,df2,how=
'outer'
))
#左链接
print(pd.merge(df1,df2,how=
'left'
))
#右链接
print(pd.merge(df1,df2,how=
'right'
))
|
join(
默认是左连接的)
df1=DataFrame({
'key'
:[
'b'
,
'd'
,
'b'
,
'g'
,
'd'
,
'u'
,
'a'
],
'data1'
:range(7)})
df2=DataFrame({
'key'
:[
'b'
,
'd'
,
's'
],
'data2'
:range(3)})
#print(df1)
#print(df2)
df3=pd.merge(df1,df2)
#print(df3)
print(
'*******************
我是分隔符
************************'
)
#
外连接,并集
print(pd.merge(df1,df2,how=
'outer'
))
#左链接
print(
'*******************
我是分隔符
************************'
)
print(pd.merge(df1,df2,how=
'left'
))
#右链接
print(
'*******************
我是分隔符
************************'
)
print(pd.merge(df1,df2,how=
'right'
))
|
concat轴向连接()
当没有索引时、concat不管列名,
直接加到一起,可以加到后面、也可以加到右边,axis=0为加到后面,axis=1为加到右边,左边的数据结构没有变,变的是右边数据结构。
|
2.合并重叠数据
combine_first
它实现既不是行之间的连接,也不是列之间的连接,它在为数据“打补丁”:用参数对象中的数据为调用者对象的缺失数据“打补丁”。
三、数据转换
1.移除重复数据
|
data=DataFrame({
'k1':[
'one']*
3+[
'two']*
4,
'k2':[
1,
1,
2,
3,
3,
4,
4]})
print(data)
print(data.duplicated())
data[
'k3']=range(
7)
print(data.drop_duplicates(
'k1'))
print(data.drop_duplicates(
'k1'
,keep=
'last'
))
|
2.
利用函数或映射进行数据转换
Series的map可以接受一个函数或有映射关系的字典型对象
3.
替换值
不修改原始数据
s1=Series([1,999,-1000,2,999])
print(s1)
print("*************repalce替换一个值*************")
print(s1.replace(999,np.nan))
print("*************repalce对不同的值进行不同的替换*************")
print(s1.replace([999,-1000],[np.nan,'None']))
print("*************repalce参数形式为字典*************")
print(s1.replace({999:np.nan,-1000:'空值啦'}))
|
4.重命名轴索引
data=DataFrame(np.arange(12).reshape(3,4),index=['Ohio','Colorado','NewYork'],columns=['one','two','three','four'])
print(data)
print('**************此种方式是就地修改原始数据********************')
data.index=data.index.map(str.upper)#此种方式是就地修改原始数据
print(data)
print('**************这种是通过创建数据的转换版********************')
print
(data.rename(index=str.title,columns=str.upper))
#
这种是通过创建数据的转换版,如果希望就地修改,加参数inplace=True
print(
'**************
还是那个原始数据
********************'
)
print(data)
#
原始数据依旧不变
print('**************结合字典类型对象实现对部分轴标签的更新********************')
print(data.rename(index={'OHIO':'Beijing','COLORADO':'Shanghai'},columns={'one':'first','two':'second'}))
|
5.离散化和面元划分
#
离散化和面元划分
ages=[
20,
22,
25,
27,
31,
21,
23,
37,
61,
41,
32]
bin=[
18,
25,
35,
60,
100]
cats=pd.cut(ages,bin)
print(
'****************
数据划分
***********************')
print(cats)
print(
'****************
以年龄数据进行分组标号
******************')
print(cats.codes)
print(
'****************
统计分组组次和频数
******************')
print(pd.value_counts(cats))
group_names=[
'Youth',
'YoungAdult',
'MiddleAged',
'Senior']
print(
'**************
设置自己的面元(分组)名称
***************')
print(pd.cut(ages,bin,labels=group_names))
print(
'**********
统计设置自己的面元(分组)名称后的组次和频数
***********')
print(pd.value_counts(pd.cut(ages,bin,labels=group_names)))
|
print(
'**************cut
中传入面元数量而不是面元名称
************')
data=np.random.rand(
20)
#
正态分布
data_cut=pd.cut(data,
4,precision=
5)
print(data_cut)
print(
'****************
统计分组组次和频数
******************')
print(pd.value_counts(data_cut))data1=np.random.randn(
1000)
data1_cut=pd.qcut(data1,
4)
print(
'****************
按四分位数进行切割
******************')
print(data1_cut)
print(
'****************
统计分组组次和频数
******************')
print(pd.value_counts(data1_cut))
print(
'****************
设置自定义分位数
******************')
data1_cut1=pd.qcut(data1,[
0,
0.1,
0.5,
0.9,
1])
print(data1_cut1)
print(
'****************
统计分组组次和频数
******************')
print(pd.value_counts(data1_cut1))
|
6.
检测和过滤异常值