第七章 数据规整化:清理、转换、合并、重塑
合并数据集
- pandas.merge:根据键将不同DataFrame中的行连接起来。
#默认做inner连接
pandas.merge(df1, df2, on=['key_a', 'key_b',...], how='outer')
# 两个对象列名不同可以分别指定
pandas.merge(df1, df2, left_on='key1', right_on='key2', how='outer')
# left_index=True或right_index=True说明索引应该被用作连接键
pandas.merge(df1,df2,left_on='key',right_index=True)
#对于层次化索引,必须以列表的形式指明用作合并键的多个列(注意对重复索引值的处理)
#join方法
df2.join(df1, how='outer')
轴索引
- pandas.concat:沿着一条轴将多个对象堆叠到一起
默认axis=0(行),如果axis=1,则结果变成DataFrame。
合并重叠数据
#用df2填补df1的空值
df1.combine_first(df2)
重塑和轴向旋转
重塑层次化索引
- stack():列->行
- unstack():行->列
将“长格式”旋转为“宽格式”
- pivot('行索引', '列索引', '填充数据的列名')
数据转换
移除重复数据
- duplicated()
默认用于全部列
# 指定列
data.drop_dulicates(['k1'])
利用函数或映射进行数据转换
data['新列名'] = data['food'].map(str.lower).map('字典名')
# 或者使用函数
data['food'].map(lamda x: 字典名[x.lower()])
替换值
- replace()
data.replace(-999, np.nan)
data.replace([-999, -1000], np.nan)
重命名轴索引
rename():创建数据集的转换板
#可结合字典对象
data.rename(index{'OHIO':'INDIANA'}
,columns={'three':'peekaboo'})
#就地修改
data.rename(inplace=True)
离散化和面元划分
连续数据常常被离散化或拆分为“面元”
- cut
ages = [20, 22, 25, 27, 21, 23, 37, 61, 45, 41, 32]
bins = [18, 25, 35, 60, 100] #拆分点
cats = pd.cut(ages, bins, right=True) #设置右边是闭端
#自己设置面元名称
cats = pd.cut(ages, bins, label=group_names)
#若cut传入的是面元的数量,而不是具体的边界,则根据数据的最大最小值计算等长面元
cats = pd.cut(ages, 4, percision=2)
返回一个特殊的Categorical对象,有属性labels, levels, value_counts
- qcut
根据样本分位数对数据进行面元划分,使面元中具有相同数量的点。
检测和过滤异常值
- any
#选出“超过3或-3的值”
data[(np.abs(data) > 3).any(1)]
#将值限制在[-3, 3]
data[np.abs(data) > 3] = np.sign(data) * 3
排列和随机采样
- permutation
df.take(np.random.permutation(len(df))[:3])
计算指标/哑变量
- get_dummies
派生K列矩阵
#给指标矩阵的列加上前缀,以可以跟其他数据合并
dummies = pd.get_dummies(df['key'], prefix='key')
结果:列'a'变成了'key_a',于是可以跟原矩阵df合并
字符串操作
字符串对象方法
- split
拆分 - strip
去掉空白符(包括换行符) - join
将列表内的字符串用某个符号连接
pieces = ['a', 'b', 'c']
val = '::'.join(pieces)
结果:'a::b::c'
- in
检测子串,或者用find或index
注:若找不到字符串,index会引发异常,find返回-1 - count
返回指定子串的出现次数 - replace
替换、删除
val.replace('::', '')
正则表达式
跳过
pandas中矢量化的字符串函数
略