1、删除重复元素
重复行判断
df.duplicated() # 重复行 显示为True,其他False (重复行第一次出现不为重复)
-
keep : 默认first 从前往后看, last 从后往前看 (重复出现的行)
-
subset=['B','C','D'] 默认对整行判断, 可指定列索引 # 表示有B, C, D重复的行,显示True
df.drop_duplicates() # 删除重复行
df[df.duplicated()] # 显示重复行数据
df[np.logical_not(df.duplicated())] 显示不重复的行数据 # 方法1
df[~df.duplicated()] # 方法2 取反
2. 映射
映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
需要使用字典:
包含三种操作:
-
replace()函数:替换元素
-
最重要:map()函数:新建一列
-
rename()函数:替换索引
(1) replace()函数:替换元素
dic = {10:100,4:104,6:106}
ddd.replace(dic) # 将DataFrame中 10,4,6 替换为字典中映射的数据100,104,106
ddd.replace([10,6], method='ffill', limit=1) # 指定替换方式
替换NaN元素
ddd = ddd.astype(np.float64)
ddd.iloc[0,1] = np.nan
ddd.replace({np.nan:0.0})
(2) map()函数:新建一列
-
使用map()函数,由已有的列生成一个新列, 适合处理某一单独的列。
-
仍然是新建一个字典, map()函数中可以使用lambda函数
传一个映射的字典
df['python'] = df['语文'].map({72:100,107:110,28:120}) # 由已有的列生成一个新列
map()函数中可以使用lambda函数
df['java'] = df['英语'].map(lambda x:x*2)
传一个自定义函数
def score(s):
if s<90:
return 'failed'
elif s>120:
return 'excellent'
else:
return 'pass'
df['English_score'] = df['英语'].map(score)
可以修改已有数据
df['数学'] = df['数学'].map({55:100, 66:120, 77:130})
transform()和map()类似
df['php'] = df['英语'].transform(lambda x:x*2)
区别: map() 一次传递一个数据,传完一列; transform 传递整个列
(3) rename()函数:替换索引
仅传字典,需指定axis
df.rename({'张三':'张十三','李四':'李十四','王五':'王老五'},axis=1)
替换行索引
df.rename(index = {'张三':'张十三','李四':'李十四','王五':'王老五'})
替换列索引
df.rename(columns={'语文':'chese','数学':'math','英语':'English','python':'py'})
3. 异常值检测和过滤
-
使用describe()函数查看每一列的描述性统计量
df.describe()
包括: count: 数据个数 mean: 平均值 std: 标准差
min: 最小值 max: 最大值 等等
df.info() 查看DataFrame信息
-
使用std()函数可以求得DataFrame对象每一列的标准差
-
根据每一列的标准差,对DataFrame元素进行过滤。
-
借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
-
对每一列应用筛选条件,去除标准差太大的数据
-
删除特定索引df.drop(labels,inplace = True), 或 df[~cond]
# 一个形状为10000*3的标准正态分布的DataFrame(np.random.randn),去除掉所有满足以下情况的行:其中任一元素绝对值大于3倍标准差
df = DataFrame(np.random.randn(10000,3))
df.abs() # 每个元素绝对值
# 判断异常数据.
# 去除掉所有满足以下情况的行
# 大于三倍标准偏差
cond = (df.abs() > df.std()*3).any(axis=1)
df[cond] # 存在大于三倍标准偏差元素的异常行
df[~cond] # 取反, 去掉异常的行
4. 排序
-
使用.take()函数排序
df.take([3,2,1]) # 指定行排序
df.take([2,1,0],axis=1) # 指定列排序
-
可以借助np.random.permutation()函数随机排序
有放回的随机抽样.
df.take(np.random.randint(0,3,size=3))
无放回的随机抽样.
df.take(np.random.permutation([0,1,2]))
5. 数据聚合【重点】
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
-
分组:先把数据分为几组
-
用函数处理:为不同组的数据应用不同的函数以转换数据
-
合并:把不同组得到的结果合并起来
数据分类处理的核心: groupby()函数
1, 分组, groupby
df.groupby(by='color')
2, 调用聚合 函数,
df.groupby(by='color').sum()[['price']] # 会先计算所有列
df.groupby(by='color')[['price']].sum() # 先取列再聚合. 计算少,性能更佳, 推荐写法.
3, 把聚合的结果追加到原始数据表.使用 pd.merge() 合并
pd.merge(df, price_sum, left_on='color', right_index=True, suffixes=['', '_sum'])
使用add_prefix(), add_suffix() 给聚合的数据修改列名
df.groupby(by='color').sum()[['price']].add_prefix('mean_')
df.groupby(by='color').sum()[['price']].add_suffix('_mean')
可以使用transform和apply实现相同功能
在transform或者apply中传入函数名即可
df.groupby(by='color').sum()[['price']] .transform(sum)
df.groupby(by='color').sum()[['price']] .apply(sum) # 会将字符串也相加