• 1 重复数据
• 2 映射
• 2.1 replace():替换元素
• 2.2 map():替换一列
• 2.3 transform():数据转换
• 2.4 rename():替换索引
• 3 聚合操作处理异常
• 4 排序
• 5 数据分类/组处理
• 6 高级数据聚合
• 7 注意
首先将numpy,pandas导入
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
创建一个DataFrame对象来作为示例
dic = {
"name":['lucy', 'jim', 'tom', 'rose', 'jack'],
"python": [100,90,89,88,98],
}
df = DataFrame(data=dic)
重复数据
- 利用DataFrame的duplicated方法,duplicated(subset=None, keep=’first’),返回一个布尔类型的Series,显示是否有重复行,无重复的行为False,有重复行的为True
• subset=None:用来指定特定的行,默认所有的行
• keep=’first’:保留第一次出现的重复项,为last时,保留最后一次出现,为False时保留全部重复行 - 利用drop_duplicated方法,drop_duplicates(subset=None, keep=’first’, inplace=False),移除DataFrame中的重复行
• subset=None:指定行
• keep=’first’:删除重复项,保留第一次出现的项,为last保留最后一次重复项,为False删除全部重复项
• inplace:为False保留副本,为True在原数据上修改
映射
映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
包含三种操作:
• replace()函数:替换元素(DataFrame\Series的函数)值的映射
• 最重要:map()函数:新建一列(Series的函数)列的映射
• rename()函数:替换索引(DataFrame的函数)索引映射
replace():替换元素
语法:replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method=’pad’, axis=None)
• to_replace:需要替换的对象,str, regex, list, dict, Series, int, float, or None
• value:替换后的值,scalar, dict, list, str, regex, default None
• inplace:是否在原数据上执行操作,bool, default False
• limit:替换次数,int, default None
• regex:to_replace的参数是否时正则,bool or same types as to_replace, default False
• method:替换方式,向前、向后替换,{‘pad’, ‘ffill’, ‘bfill’, None}
• axis:方向 - Series对象替换
获取索引为2的数据
s = df.iloc[2]
单值替换
s.replace('before', 'after')
s.replace({'before': 'after'})
多值替换
s.replace(['before1', 'before2'], ['after1', 'after2']) # 列表值替换
s.replace({'before1': 'after1', 'before2': 'after2'}) # 字典映射值替换
method填充方式
s.replace(['before1', 'before2'], method='pad') # 向前填充
s.replace(['before1', 'before2'], method='ffill') # 向前填充
s.replace(['before1', 'before2'], method='bfill') # 向后填充
limit控制次数
s.replace(['before1', 'before2'], method='pad', limit=1) # 只填充第一个重复项
- DataFrame对象填充
单值替换
df.replace('before', 'after') # 一对一的值替换
df.replace({'before': 'after'}) # 字典映射替换关系
按列指定单值替换
df.replace({'column': 'before'}, 'after') # 替换column列中的before
df.replace({'column1': 'before1', 'column2': 'before2'}, 'after') # 替换两列中的两个元素值
多值替换
df.replace(['before1', 'before2', 'before3'], ['after1', 'after2', 'after3'])
df.replace({'before1': 'after1', 'before2': 'after2'}) # 字典映射的替换关系
df.replace({'before1', 'before2'}, {'after1', 'after2'}) # 后面的替换前面的两个值
正则替换
df.replace(r'?|.|$',np.nan,regex=True)#用np.nan替换?或.或$原字符
df.replace(regex={r'?':None})
value参数显式传递
df.replace(to_replace=[150,300], value=[0,0])
map():替换一列
map()函数是series的函数,一般是对DataFrame的某一列进行整体的映射
• map()可以接受一个字典
• map()可以使用lambd表达式
• map()可以使用自定义的方法
• map()可以映射新一列数据
注意
• map()中不能使用sum之类的聚合函数、for循环
• map(字典)字典的键要足以匹配所有的数据,否则出现NaN
使用字典一般处理离散型的映射
我们用key,来表示数据中存在的需要创建映射的值,value来表示主动生成的映射值
df["column"].map({"key": "value"}) # 返回的是映射所在的新的一列,没有的数据填充NaN
传入map的字典,简直比映射列的值多时,多出的值,不会报错,不会产生映射,根据这个特性,可以将所有需要映射的内容,统一整合到一个字典中
map_dic = {
"lucy": "ming",
"jim": "Jimmy",
"tom": "Tommy",
"rose": "Rosey",
"Tim": "Timmy"
}
df["name"].map(map_dic)
map中传入函数
传入map()中的是函数名,这个函数可以显式函数,也可以是匿名函数,传入函数后会对获取的列中的元素,挨个处理。传入函数一般处理数值型的映射
显式函数
def map_func(x):
"""
获取字典值,如果没有则返回传入值本身
"""
return dic.get(x, x)
获取df中的一列,使用显式函数,形成映射关系
df["name"].map(map_func)
或者传入一个匿名函数
df["name"].map(lambda x: dic.get(x, x)) # 两个表达式的结果是一样
需要注意的是,map()函数没有inplace属性,不能再原数据上修改,如果需要将原数据修改,或者新增加一列来接受映射值,需要定义。
df["name"] = df["name"].map(map_func)
transform():数据转换
参数:func : function, str, list or dict。可以传入函数,函数的名字,函数名的列表,或者一个用于数据处理的字典
transform输出的是原输入的DataFrame大小的,是经过了转换的DataFrame
由于transform()可以接收包含几个函数的列表,所以可以返回多于原始数据长度的的数据。
rename():替换索引
参数说明:
• mapper:替换所有的索引
• index:替换行索引
• columns:替换列索引
• level:指定多维索引的维度
• axis:指定操作数据的方向
• inplace:是否再原数据上操作
和map()函数一样,如果接收的字典参数中,右多余的数据,不会报异常。
同时,rename()支持接受多个参数,例如rename(mapper, axis={‘index’, ‘columns’}, …)
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df.rename(index=str, columns={"A": "a", "B": "c"})