转自公众号数据分析1480,作者刘顺祥
数据读写
pd.read_csv:读取文本文件(csv、tsv、txt等格式)
pd.read_excel:读取电子表格(xls或xlsx格式)
pd.read_sql:读取数据库数据(需要pymysql或pymssql模块的配合)
df.to_csv:写入文本文件(df为DataFrame对象)
df.to_csv:写入电子表格
df.to_csv:写入数据库
例子
# 读入MySQL数据库数据
# 导入第三方模块
import pymysql
# 连接MySQL数据库
conn = pymysql.connect(host = 'localhost',password = 'test',database = 'test',port = 3306,charset = 'utf8')
# 读取数据
user = pd.read_sql('select * from topy',conn)
# 关闭连接
conn.close()
数据基本描述
df.head:预览数据前几行
df.tail:预览数据后几行
df.shape:返回数据的行列数
df.columns:返回数据集的列名称
df.dtypes:返回数据集各变量的类型
df.describe:返回数据的描述性统计量
S.value_counts:离散变量的频次统计
S.quantile:连续变量的分位数列表
S为Series对象
数据清洗
df.isnull:判断数据是否存在缺失值
df.duplicated:判断数据是否存在重复值
df.dropna:删除缺失值
df.fillna:填充缺失值
df.drop_duplicates:删除重复值
df.drop:删除变量或某些行(可以是变量也可以对行索引)
df.rename:重命名(同上)
df.reset_index:行索引转变量
类型转换与元素及运算
S.astype:类型转换(可转int、float、str等)
S.map:元素级映射
S.apply:元素级处理
pd.to_datetime:类型转换(可转日期时间型)
# 将birthday变量转换为日期
df.birthday=pd.to_datetime(df.birthday,format = '%Y%m%d'
# 将手机号转换为字符串
df.tel = df.tel.astype('str')
# 新增年龄和工龄两项
df['age'] = pd.datetime.today().year - df.birthday.dt.year
df['workage'] = pd.datetime.today().year - df.start_work.dt.year
# 将手机中间四位数隐藏起来
def.tel = df.tel.apply(func = lambda x : x.replace(x[3:7],'****'))
# 取出邮箱的域名
df['email_domain'] = df.email.apply(func = lambda x : x.split('@')[1])
# 取出人员的专业信息
df['profession'] = df.other.str.findall('专业:(.*?),')
# 去除birthday、start_work和other变量
df.drop(['birthday','start_work','other'],axis = 1,inplace = True)
数据合并、连接与汇总
pd.concat:数据合并(可以是行合并,也可以是列合并)
pd.merge:数据连接(与数据库的join操作类似)
pd.pivot_table:透视表
df.groupby:数据分组
df.groupby.summarize:分组统计
# 构造数据集df1和df2
df1 = pd.DataFrame({'name':['张三','李四','王五'],'age':[21,22,21],'gender:['M','F','M']})
df2 = pd.DataFrame({'name':['张一','李二','王六'],'age':[20,21,22],'gender:['F','F','M']})
# 数据的纵向合并
pd.concat([df1,df2],keys = ['df1','df2'])
# df3数据集的名字为Name
df3 = pd.DataFrame({'Name':['张三丰','李二狗','王六'],'age':[20,21,22],'gender:['F','F','M']})
# 数据集的纵向合并
pd.concat([df1,df2])
# 三表的数据连接
merge1 = pd.merge(left = df1,right = df2,how = 'left')
merge2=pd.merge(left = merge1,right = df3,how = 'inner')