《利用Python进行数据分析》——Chapter6:数据规整化:清理、转换、合并、重塑

合并数据集

pandas.merge	#可根据一个或多个键将不同DataFrame中的行连接起来
pandas.concat	#沿着一条轴将多个对象堆叠在一起
conbin_first	#将重复的数据编接在一起
  1. 数据库风格的DataFrame合并
  1. pd.merge(df1,df2,on=‘xxx’):将两个DataFrame合并起来,没有指明用那个行当做连接,默认用重叠列名的列当作键(on=‘列名’:显示指定)
  2. 若没有相同列名,则可以分别指定:pd.merge(df1,df2,left_on=‘xxx’,right_on=‘xxx’)
  3. 连接方式用inner(结果是交集)、outer(结果是并集)、left(以左侧为基础)、right(以右侧为基础)
  4. 多对多连接时,产生的笛卡儿积
  5. 根据多个键进行合并:传入一个由列名组成的列表即可(多个键形成一系列元组,并将其当作单个连接键
  6. 在进行列-列连接时,DataFrame中的索引会被丢弃
  7. 对重复列名的处理(两个DatFrame有多个重复列名,只根据其中的一个合并DataFrame,其他的重复的列名就是一个问题):suffixes=(‘xxx’,‘xxx’)(指定附加到左右两个DataFrame对象的重叠列名上的字符串)
# merge的参数表
left/right		#参与合并的左侧/右侧DataFrame
how			#inner、outer、left、right其中之一,默认为inner
on			#用于连接的列名,必须存在于左右两个DataFrame中
left_on/right_on	#左侧DataFrame中用作连接键的列
left_index/right_index	#将左侧/右侧的行索引用作其连接键
sort			#根据连接键对合并后的数据进行排序,默认为False
suffixes		#字符串值元组,用于追加到重叠列名的末尾,默认为('_x','_y')
copy			#默认False
  1. 索引上的合并
>>> pd.merge(index_right=True/index_left=True)
# 层次化索引就比较麻烦:以列表的形式指明用作合并键的多个列(结果值的索引使用左DataFrame的索引)
>>> pd.merge(left, right, left_on=['key1','key2'], right_index=True)
# 使用join实例方法实现按索引合并:还可以合并多个带有相同或相似索引的DataFrame对象
>>> df1.join(df2)
>>> df1.join(df2, on='xxx')	#参数DataFrame(df2)的索引和调用者DataFrame(df1)的某个列之间的连接
>>> df1.join([df2,df3])		#向join传入一组DataFrame
  1. 轴向连接:concat函数
objs		#参与连接的pandas对象的列表或字典	
axis		#指明连接的轴向
join		#inner(交集)/outer(并集)
join_axes	#指定要在其他轴上使用的索引
keys		#在连接轴上创建一个层次化索引,在结果中指明连接的片段
names		#创建分层级别的名称
verify_integrity	
ignore_index	#不保留连接轴上的索引,产生一组新索引range(total_length)
  1. 合并重叠数据

用参数对象中的数据为调用者对象的缺失数据打补丁

df1.combine_first(df2)

重塑(reshape)和轴向旋转(pivot)

  1. 重塑层次化索引
frame.stack():将DataFrame的列旋转为行,得到一个Series
Series.unstack():对于一个层次化索引的Series数据,将其重排为DataFrame/把DataFrame的行索引转至列名
	1. 传入分层级别的编号或名称即可对其他级别进行unstack操作:frame.unstack(0)/frame.unstack('state')
	2. stack会滤除缺失数据,也可以frame.stack(dropna=False)
	3. 在对DataFrame进行unstack时,作为旋转轴的级别将成为结果中的最低级别
  1. 将“长格式”旋转为“宽格式”:pivot
pivoted = ldata.pivot('date','item','value')
	#前两个参数作为行索引和列索引的列名,最后一个参数则是用于填充DataFrame的数据列的列名
忽略第三个参数,会得到一个带有层次化的列

数据转换

  1. 移除重复数据
frame.duplicated()	#返回一个布尔型Series,表示各行是否是重复行
frame.drop_duplicates()	#返回一个移除了重复行的DataFrame
	#默认对所有列的数据一起进行是否重复的判断
frame.drop_duplicates(['xx'], take_last=True)	#对指定列进行是否重复项的判断;take_last保留最后一个出现的值组合,否则默认保留第一个出现的值组合
  1. 利用函数或映射进行数据转换
frame['yyy']=frame['xxx'].map(fun)	#map函数,对frame中的xxx列的数据进行map操作,将结果填入yyy列中区
  1. 替换值
Series.replace()
data.replace(-999,np.nan)
data.replace([-999,-1000],[np.nan,0])
data.replace({-999:np.nan, -1000:0})
  1. 重复名轴索引

将轴标签通过函数或映射进行转换,从而得到一个新对象

data.index.map(str.upper)
data.rename(index=str.title, columns=str.upper)
data.rename(index={'OHIO': 'ohio'})
data.rename(index={'OHIO': 'ohio'},inplace=True)	#就地修改某个数据集
  1. 离散化和面元划分
cut():	pd.cut(frame, bins, right=False, labels=group_name)
	# 对frame按照bins(面元边界)进行面元划分
	# 默认右开左闭,通过right=False进行修改
	# 使用labels设置自己的面元名称
	# 如果向cut传入的是面元的数量而不是面元的边界,则它会根据数据的最小值和最大值计算等长面元
qcut():	pd.qcut(data, 4)/pd.qcut(data,[0,0.1,0.5,0.9,1])
	# 对frame根据样本分位数进行面元划分,得到大小相等的面元
	# 设置自定义的分位数
  1. 检测和过滤异常值

实际上就是数组运算

frame[(np.abs(data)>3).any(1)]	#选出全部含有“超过3或-3的值”的行
data[np.abs(data)>3] = np.sign(data)*3	#对“超过3或-3的值”赋值为3(np.sign()这个函数返回的是1和-1的数组,表示原始值的符号)
  1. 排列和随机采样
sampler = np.random.permutation(5)	#随机重排序数组
df.take(sampler)	#按照随机重排序的数组改变df的行顺序
df.sample(n=4)		#随机抽取4行作为sample
draws = choices.sample(n=10, replace=True)
  1. 计算指标/哑变量

如果DataFrame的某一列有k各不同的值,则可以派生出一个k列的DataFrame

pd.get_dummies(frame['key'])	#对frame中的key列中的不同的值进行哑变量判断
dummies = pd.get_dummies(frame['key'], prefix='key')	#为哑变量的列加前缀
如果DataFrame中的某行同属于多个分类
# 先提取出该列中所有的分类
for x in movies.genres:
    all_genres.extend(x.split('|'))
genres = pd.unique(all_genres)
# 再对提取出的分类做哑变量分析
dummies=pd.DataFrame(zero_matrix, columns=genres)
gen = movies.genres[0]
gen.split('|')
dummies.columns.get_indexer(gen.split('|'))

字符串操作

  1. 字符串对象的方法
用split将字符串对象以特定分隔符拆分
val.split(',')
用strip修建空白符
val.strip()
用加法(+)将子字符串以特定方式连接起来
first + '::' + second + '::' + third
# Python内置的字符串方法
count		#返回参数串在字符串(调用)中的出现次数
endswith、startswith	#如果字符串以某个后缀结尾(或以某个前缀开头),返回True
join		#将调用字符串用作连接其他字符串(参数字符串)序列的分隔符
index		#如果在字符串(调用)中找到子串(参数),返回子串第一个字符所在的位置。若没有找到,引发ValueError
find		#如果在调用中找到参数,返回第一个发现子串的第一个字符的位置;若没有找到,返回-1
rfind		#如果在调用中找到参数,则返回最后一个发现子串的第一个字符的位置;若没有找到,返回-1
replace		#用第二个参数代替第一个参数
strip、rstrip、lstrip	#去除空白符(包括换行符)。相当于对各个元素执行
split		#通过指定的分隔符将字符串拆分为一组子串
lower、upper	#分别将字母字符转换为小写或大写
ljust、rjust	#用空格(或其他字符)填充字符串的空白测已返回符合宽度的最低宽度的字符串
  1. 正则表达式(regex)

提供了一种灵活的在文本中搜索或匹配字符串模式的方式
python中内置的re模块负责对字符串应用正则表达式:模式匹配、替换、拆分
如果对许多字符串应用同一条正则表达式,建议通过re.compile创建regex对象,可以节省大量的CPU时间

re.split('\s+', text):描述一个或多个空白符的regex是"\s+",对text以空白符拆分
regex = re.compile('\s+'); a.split(text)	
regex = re.compile(pattern, flags=re.IGNORECASE); regex.findall(text)
			#使用re.compile自己编译,可以直接对text进行拆分

print(regex.sub('REDACTED', text))	# 将匹配到的模式替换为指定字符串,并返回所得到的新字符串
# 正则表达式方法
findall、finditer	#返回字符串中所有的非重叠匹配模式,fingall返回的是由所有模式组成的列表,finditer则通过一个迭代器逐个返回
match		#从字符串起始位置匹配模式,返回一个匹配项对象,否则返回None
search		#扫描整个字符串以匹配模式,找到返回一个匹配项对象
spilt		#根据找到的模式将字符串拆分为数段
sub、subn	#将字符串中所有的(sub)或前n个(subn)模式替换为指定表达式
  1. pandas中矢量化的字符串表达式

通过data.map,所有字符串和正则表达式方法都能被应用于传入lambda表达式或其他函数的各个值,但是如果存在NA就会报错。为了解决这个问题,Series有一些能够跳过NA值的字符串操作方法。通过Series的str属性即可访问这些方法

# 矢量化的字符串方法:Series.str.xxx()(str的Series,对元素级的操作)
cat		#实现元素级的字符串连接操作,可指定分隔符
contains	#返回表示各字符串是否含有指定模式的布尔型数组
count		#模式出现的次数
endswith、startswith
findall
get		#获取各元素的第i个字符
join		#根据指定的分隔符将Series中各元素的字符串连接起来
len		#计算各字符串的长度
lower、upper	#对各元素执行x.lower()或x.upper()
match	
pad		#在字符串的左边、右边或左右两边添加空白符
center		#相当于pad(side='both')
repeat
replace
slice		#对各个字符串进行子串截取
split		
strip、rstrip、lstrip

你可能感兴趣的:(python,McKinney,python,数据,数据规整化)