数据规整化:清理、转换、合并、重塑

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函数

函数原型:

 参数说明:

  1. index 指明哪个列变为新DataFrame的index,注意是哪个,而不是哪些;
  2. columns 指明哪个列变为columns;
  3. 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))

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值