pandas.merge #可根据一个或多个键将不同DataFrame中的行连接起来
pandas.concat #沿着一条轴将多个对象堆叠在一起
conbin_first #将重复的数据编接在一起
- pd.merge(df1,df2,on=‘xxx’):将两个DataFrame合并起来,没有指明用那个行当做连接,默认用重叠列名的列当作键(on=‘列名’:显示指定)
- 若没有相同列名,则可以分别指定:pd.merge(df1,df2,left_on=‘xxx’,right_on=‘xxx’)
- 连接方式用inner(结果是交集)、outer(结果是并集)、left(以左侧为基础)、right(以右侧为基础)
- 多对多连接时,产生的笛卡儿积
- 根据多个键进行合并:传入一个由列名组成的列表即可(多个键形成一系列元组,并将其当作单个连接键
- 在进行列-列连接时,DataFrame中的索引会被丢弃
- 对重复列名的处理(两个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
>>> 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
objs #参与连接的pandas对象的列表或字典
axis #指明连接的轴向
join #inner(交集)/outer(并集)
join_axes #指定要在其他轴上使用的索引
keys #在连接轴上创建一个层次化索引,在结果中指明连接的片段
names #创建分层级别的名称
verify_integrity
ignore_index #不保留连接轴上的索引,产生一组新索引range(total_length)
用参数对象中的数据为调用者对象的缺失数据打补丁
df1.combine_first(df2)
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时,作为旋转轴的级别将成为结果中的最低级别
pivoted = ldata.pivot('date','item','value')
#前两个参数作为行索引和列索引的列名,最后一个参数则是用于填充DataFrame的数据列的列名
忽略第三个参数,会得到一个带有层次化的列
frame.duplicated() #返回一个布尔型Series,表示各行是否是重复行
frame.drop_duplicates() #返回一个移除了重复行的DataFrame
#默认对所有列的数据一起进行是否重复的判断
frame.drop_duplicates(['xx'], take_last=True) #对指定列进行是否重复项的判断;take_last保留最后一个出现的值组合,否则默认保留第一个出现的值组合
frame['yyy']=frame['xxx'].map(fun) #map函数,对frame中的xxx列的数据进行map操作,将结果填入yyy列中区
Series.replace()
data.replace(-999,np.nan)
data.replace([-999,-1000],[np.nan,0])
data.replace({-999:np.nan, -1000:0})
将轴标签通过函数或映射进行转换,从而得到一个新对象
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) #就地修改某个数据集
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根据样本分位数进行面元划分,得到大小相等的面元
# 设置自定义的分位数
实际上就是数组运算
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的数组,表示原始值的符号)
sampler = np.random.permutation(5) #随机重排序数组
df.take(sampler) #按照随机重排序的数组改变df的行顺序
df.sample(n=4) #随机抽取4行作为sample
draws = choices.sample(n=10, replace=True)
如果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('|'))
用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 #用空格(或其他字符)填充字符串的空白测已返回符合宽度的最低宽度的字符串
提供了一种灵活的在文本中搜索或匹配字符串模式的方式
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)模式替换为指定表达式
通过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