合并数据集
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:字符串形式。给列名前加前缀。
字符串操作
字符串对象方法
方法 | 说明 |
---|---|
count | str.count(word) 返回word在str中的出现次数。 |
endswith、startswith | 判断某个字符串是否以某个后缀结尾,以某个前缀开头。 |
join | list.join(mark) |
split | str.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”) |
repeat | s.str.repeat(int),重复值int次。 |
slice | 对Series中各个字符串进行字串截取。 |