一、合并数据集
数据库风格的DataFrame合并,
pd.merge(df1,df2)
–显式指定键,on='jianming'
–分别指定,left_on='lkey',right_on='rkey'
–默认是做交集,可以修改成并集how='outer'
,还可以选择right,left
–根据多行合并,传入一个由列名组成的表,on=['key1','key2']
–对重复的不是键的列名加后缀,suffixes=('_left','_right')
索引上的合并
–连接键在索引之中,left_index=True,right_index=True
—-对于层次化索引,必须以列表的形式指明做合并的多个键on=['key1','key2']
–另一种是join,可以很方便的实现按索引合并,形如left2.join(right2,how='outer')
—-索引和某个列,left2.join(right2,on='key',how='outer')
—-还可以一次传入几个DataFrame和前面的数据框合并轴向连接 pd.concat([s1,s2,s3])
–默认是在长度上连接,在宽度上是axis=1
–默认是有序并集,可以修改成为交集,join='inner'
–指定要用的索引(原数据没有的话填充NA),join_axis=[['a','b']]
–创建层次化索引区分连接片段,有几段就写几个,keys=['one','two','three']
–传入不是别表而是字典,字典就会被当作keys选项的值
–默认保留原行索引,如果行索引和当下的分析工作无关,可以不保留,ignore_index=True
合并重叠数据
–判断a是不是缺失,不缺失取a,缺失取b,np.where(pd.isnull(a),b,a)
–同上,b.combine_first(a)
二、重塑和轴转向
重塑层次化索引
–把数据的列转化为行,data.stack()
–把数据的行转化为列,data.unstack()
–操作的是最内层,可以传入分层级别的编号和名称,对其他级别进行unstack的操作
–stack默认滤除缺失值,dropna=False可以进行保留
–unstack的操作,作为旋转轴的级别将会成为结果中的最低级别长格式转化为宽格式
–ldata.pivot('date','item',value')
第一个是行索引,第二是列索引,最后是填充数列的列名
–填充数列的列有两列,第三个参数又不写,就会有层次化的列
三、数据转换
移除重复数据
–返回布尔型是否是重复数据,data.duplicated()
–返回移除了重复行的DataFrame,data.drop_duplicates()
–这两种方法都默认是判断全部列,可以指定列,data.drop_duplicates('k1')
–这两个方法默认保留第一个,take_last=True
保留最后一个利用函数或映射进行数据转换,使用map
–map方法可以接受一个函数或含有映射关系的字典型对象
–data['food'].map(str.lower).map(meat_to_animal)
–data['food'].map(lambda x: meat_to_animal[x.lower()])
替换值
–data.replace(-999,np.nan)
–data.replace([-999,-1000],np.nan)
–data.replace([-999,-1000],[np.nan,0])
–传入参数也可以是字典重命名轴索引
–map方法,data.index.map(str.upper)
–创建修改后的副本,data.rename(index=str.title,columns=str.upper)
—-可以结合字典对象对部分索引更新
—-如果直接修改原数据,inplace=True离散化和面元划分
bins=[18,25,35,60,100]
cats=pd.cut(data,bins)
–分成(18,25],(25,35],…(60,100]
–cats.labels 返回数字表示类别的属性
–cats.levels 不同分类名称的数组
–修改那边是闭端,right=False
–设置自己的分类名称,labels=['youth','Senior']
–如果输入的不是分类边界而是组数,会按照最大值和最小值均匀分组
–qcut类似于cut是对数据按照分位数进行划分
6.检测和过滤异常值
–筛选出所有含有绝对值超过3的值的行data[(np.abs(data)>3).any(1)]
–对所有绝对值超过3的值设为3和-3,data[(np.abs(data)>3)]=np.sign(data)*3
7.排列和随机采样(对行)
–np.random.permutation(5) 对0-4随机
–不放回采样df.take(np.random.permutation(len(df))[:3})
–返回采样 data.take(np.random.randint(0,len(data),size=10))
8.计算指标/哑变量
–pd.get_dummies(df['key'])
–加上前缀:pd.get_dummies(df['key'], prefix='key')
–对于某行同属于多分类p215
四、字符串操作
- 字符串对象方法
–拆分
val = 'a,b, guido'
val.split(',')
–拆分并删除空格 pieces = [x.strip() for x in val.split(',')]
–字符串连接 first + '::' + second + '::' + third
'::'.join(pieces)
–判断字符串是否在其中 'guido' in val
–子串定位 val.index(',')或val.find(':')
返回第一个字符所在的位置,没找到前者错误,后者返回-1
–返回子串出现的次数val.count(',')
–替换,也可以用于删除val.replace(',', '::')
删除:val.replace(',', '')
2.正则表达式:一种灵活的在文本中搜索或匹配字符串模式的方式
import re
text = "foo bar\t baz \tqux"
re.split('\s+', text)
–自己编译regex regex = re.compile('\s+')
regex.split(text)
–获得匹配regex的所有模式,regex.findall(text)
–返回第一个匹配项 regex.search(text)
–匹配字符串首部的模式 regex.match(text)
–将匹配到的模式替换 regex.sub('REDACTED', text)
–参数,对大小写不敏感 flags=re.IGNORECASE
–模式分段:将分段的各部分用圆括号表示
pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
regex = re.compile(pattern, flags=re.IGNORECASE)
—-可以用group的方法返回一个由模式各段组成的元组
m = regex.match('wesm@bright.net')
m.groups()
—-sub可以通过\1,\2等符号来访问各个匹配项中的分组
print(regex.sub(r'Username: \1, Domain: \2, Suffix: \3', text))
3.pandas中矢量化的字符串函数
–能够跳过NA值的字符串操作办法,利用Series的str属性
–检查是不是含有子串:data.str.contains('gmail')
–使用正则表达式 data.str.findall(pattern, flags=re.IGNORECASE)
–获取元素matches.str.get(1) 或matches.str[0]