Python for Data Analysis:数据规整化-清理、转换、合并、重塑

合并数据集

merge
(1) 函数参数

pd.merge(leftFrame,rightFrame,on,how)
on:用于连接的列名。若两个Frame共同列的列名不同,可以用left_on和right_on指示。
how:inner交集、outer交集、left、right
left_index:将左侧的行索引用作其连接键。bool
right_index:类似于left_index。bool

(2) 示例

pd.merge(df1,df2)

在这里插入图片描述
在这里插入图片描述

pd.merge(df3,df4,left_on = "lkey",right_on= 'rkey')
pd.merge(df3,df4,left_on = "lkey",right_on= 'rkey',how = "outer")

在这里插入图片描述
在这里插入图片描述

pd.merge(left1,right1,left_on = "key",right_index = True)

在这里插入图片描述
在这里插入图片描述

join按索引合并
join默认是按索引合并,只有传入on参数才按某一列连接。

lFrame.join(rFrame,how,on)

concat 轴上连接

concat(obj,axis,join,ioin_axes,keys)
obj:参与连接的pandas对象的列表或字典。
axis:设为1时列方向合并,默认时行方向合并。
join:inner交集合并,outer并集合并。
join_axes:指明用于其他轴的索引。
keys:形成连接轴向上的层次化索引。

在这里插入图片描述

combine_first 合并重叠数据
在这里插入图片描述
“打补丁”

frame1.combine_first(frame2)
重塑和轴向旋转

stack、unstack重塑层次化索引
stack:将数据的列旋转为行。
unstack:将数据的行旋转为列。

pivot将“长格式”旋转为“宽格式”

数据转换

移除重复数据
(1) frame.duplicated()检查各行是否是重复行。如果是重复则为True,不重复则为Fasle。
(2) frame.drop_duplicates()返回一个移除了重复行的DataFrame。
drop_duplicates([colname])可指定部分列进行重复项判断。
默认保留的是第一个出现的值组合,可传入take_last = True保留最后一个。

map 利用函数或映射进行数据转换
(1) Series的map方法。map可以接受一个函数或含有映射关系的字典型对象。

将某一列转换为大写
frame['animal'].map(str.upper)
将某一列转换为别的内容
frame['animal'].map(Dict)

replace 替换值

data.replace(原数值,替换后数值)

data.replace(-999,np.nan)
data.replace([0,-999],np.nan)
data.replace({-999:np.nan,-1000:0})

map、rename 重命名轴索引
(1) Series的标签也有map 方法
将DataFrame索引转换成大写。

data.index = data.index.map(str.upper)

(2) rename可以复制DataFrame并对其索引和标签进行赋值。可通过replace = True参数就地修改数据集。

将DataFrame的行索引首字母大小,列索引全大写。
data.rename(index = str.title,columns = str.upper)

利用字典对部分索引进行更改。
data.rename(index = {old:new},columns = {old:new})

cut 离散化和面元划分
(1) cut:将一组数据划分为不同的组。

cut(obj,bins,right,labels,precision)
bins:分组数值的列表
labels:设置bin的名称
right:设置右闭端
precision:

示例:将年龄分组

age = [20,22,25,27,21,23,37,31,61,45,41,32]
bin = [18,25,35,60,100]
label = ['Youth','YoungAdult','MiddleAged','Senior']
cats = pd.cut(age,bins = bin,right = True,labels = label )

cats.labels
pd.value_counts(cats)

在这里插入图片描述
(2) cut也可以传入bin数量,它会根据数据的最小值和最大值计算等长bin。

data = np.random.rand(20)
pd.cut(data,4,precision = 2)

(3) qcut可以根据样本分位数对数据进行bin划分。

按四分位数进行切割
pd.qcut(data,4)

检测和过滤异常值
(1) 首先对data进行信息总汇总。
在这里插入图片描述
(2) 找到某一列中绝对值大小超过3的值。

col[np.abs(col) > 3]

(3) 选出全部含有“超过3或-3的值”的行。

data[(np.abs(data) > 3).any(axis = 1)]

(4) 将值限制在区间-3到3以内。

data[np.abs(data) > 3] = np.sign(data) * 3

permutation 排列和随机采样
numpy.random.permutation可以产生一个表示新顺序的整数数组。传入值是排列数据的长度。

sampler = np.random.permutation(5)

然后在take()中使用该数组:

df = pd.DataFrame(np.arange(20).reshape(5,4))
df.take(sampler)

get_dummies 计算指标/哑变量

pd.get_dummies(df[col],prefix)
prefix:字符串形式。给列名前加前缀。
字符串操作

字符串对象方法

方法说明
countstr.count(word) 返回word在str中的出现次数。
endswith、startswith判断某个字符串是否以某个后缀结尾,以某个前缀开头。
joinlist.join(mark)
splitstr.split(mark)
index在字符串中找到字串,返回字串第一个字符的位置。
find在字符串中查找字串,找到就返回第一个字串位置,找不到返回-1。
rfind在字符串中查找字串,找到就返回最后一个字串位置,找不到返回-1。
replace替换。
strip、rstrip、lstrip去除空白格。
lower小写。
upper大写。
ljust、rjust用空白格填充字符空白侧,返回符合最低宽度的字符串。

正则表达式
re模块
(1) 拆分:re.split(seperator,str)

text = "foo bar\t baz   \tqux"
re.split('\s+',text)

也可以先用re.compile编译得到一个可重用的regex对象。re.compile可以传入flags = re.IGNORECASE表示大小写均可。

regex = re.compile('\s+')
regex.split(text)

(2) 模式匹配:
返回所有匹配项:regex.findall(str)
返回第一个匹配项:regex.search(str)
只匹配字符串的首部:regex.match(str)

(3) 替换:
regex.sub(替换内容,str)
如果想让regex在替换内容中出现。参数传入r'\1 \2 \3'

pandas中矢量化的字符串函数
通过Series的str属性即可访问这些问题。

方法说明
cat实现元素集的字符串连接操作。
contains检验是否含有指定模式。
count模式的出现次数。
endswith、startswith检测前缀和结尾。
findall寻找所有匹配的模式。
get获取各个元素的第i个元素。
join指定分割符将Series各元素的字符串连接起来。
len计算各字符串长度。
lower、upper大写、小写
pad在字符串的左边、右边和左右两边添加空白符。
center相当于pad(side = “both”)
repeats.str.repeat(int),重复值int次。
slice对Series中各个字符串进行字串截取。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值