Python数据分析

目录

pandas数据结构

1.数据分析常用开源库

2.Pandas 数据结构

Series的创建

Series属性

3.Series的常用方法

4.方法应用

5.DataFrame创建

6.DataFrame常用方法

7.数据的保存和读取

8.Df之间HS运算(查询)

9.query查询(纯where筛选)

10.isin函数

11.DF增列

12.DF删除

13.去重

14.DF修改

15.Series/apply自定义函数

16.DataF/apply自定义函数

17.修改行列索引

18.pandas/Mysql


pandas数据结构

1.数据分析常用开源库

Pandas

  • 基于Numpy,特点高效的科学计算库,核心的数据对象是ndarray(n维数组)

  • Series 一列数据

  • DataFrame 二维表

绘图的库最基础的 Matplotlib

  • Pandas 有绘图的API,基于Matplotlib

  • Seaborn 基于Matplotlib

2.Pandas 数据结构
Series的创建

pd.Series()

  • S大写

  • 传入一个、两个参数

  • 第一个参数就是数据, 也可以通过index = 指定行索引

  • 如果不指定行索引, 会默认添加从0开始的索引

传入的数据可以是以下类型

  • numpy的ndarray

  • python 列表,元组,字典

  • 传入的如果是字典,字典的key作为索引,Value就是数据

一列Series数据类型必须一致的

  • 如果既有字符串,又有数字,会默认是字符串类型 Object

Series属性
s.shape # 形状 描述Series有几行 返回一个元组
s.values # Series的值 默认ndarray类型
s.index  # Series的索引, 如果手动指定, 就是一个ndarray类型, 如果是自动生成 rangeIndex()
3.Series的常用方法

加载数据之后,做具体的业务处理之前,一般固定的套路

head() info() describe()

s1.head() # 从脑袋上取前5条

s1.info() # 字段有哪些,有没有空值

s1.describe() # 看数据的分布情况

s1.describe(include='all') # 查看所有数据分布情况

===================================================================

s1.argmax() # 返回最大值的下标

s1.argmin() # 返回最小值的下标

s1.idxmax() # 返回最大值的索引值

s1.idxmin() # 返回最小值的索引值

===================================================================

s1.tail() # 从尾巴上取后5条

s1.shape() # 显示几行几列

s1.values() # 显示所有值

===================================================================

s1.index() # 行索引FW及步长

s1.columns() # 显示列索引及类型

set_index(列名) # 把某一列数据作为索引

reset_index() # 重置所以为从0开始的整数

s1.to_list() # 转换成列表

s1.to_frame() # 转换成DF(二维表),有行列

===================================================================

s1.count() # 计数

s1.std() # 标准差(方差开根号,反映了数据的离散程度)

s1.mean() # 求平均值

s1.min() # 求最小值

s1.max() # 求最大值

s1.drop_duplicates() # 去重,假删

s1.drop_duplicates(inplace=True) # 去重,真删

inplace=False  创建副本修改,不改变原数据
inplace=True   改的是原数据

s1.unique() # 看有几个唯一值

s1.sort_values() # 排序升序

ascending=True  排序升序
ascending=False  排序降序
# 默认是升序

s1.sort_values(by='筛选字段名',ascending=False) # 排序降序

s1.value_counts(ascending=False) # 分组计数,查看每个分组的数量并降序

4.方法应用

(1)加载文件

df = pd.read_csv('D:/Yuanman/day01/02_代码/data/scientists.csv')
df

(2)条件判断

# select *
df[直接就条件]
# 相当于sql中的where筛选
df['Name'][df['Occupation']=='Statistician']
# 多个条件需要用()括起来,位运算连接(and:&,or:|)

(3)对单列进行操作

df['Age']=df['Age']*1 # 对单列进行操作
df 

(4)对指定索引列进行操作

df['Age']+pd.Series([10,20],index=[2,3]) # 对指定索引列进行操作

(5)不管左没有还是右没有,均显示NaN

df['Age']+pd.Series([10,10,10,10,10,10,10,10],index=[2,3,4,5,6,7,8,9]) 
5.DataFrame创建
# 定义一个字典
dict_data ={  
    'id':[1,2,3],
    'name':['张三','李四','王五'],
    'age':[18,20,22]
}
# 储存在df中
df = pd.DataFrame(dict_data) 
df
6.DataFrame常用方法

同Series一样,祥见第3题或第7题

7.数据的保存和读取
# 创建数据文件
import pandas as pd
data =[
[1,'张三','1999-3-10',18],
[2,'李四','2002-3-10',15],
[3,'王五','1990-3-10',33],
[4,'隔璇老王','1983-3-10',40]
]
df = pd.DataFrame(data,columns=['id','name','birthday','age'])
# 将数据存储为表格文件
df.to_excel('test2.xlsx',sheet_name='student',index=False)
# 读取该文件
pd.read_excel('test2.xlsx',sheet_name='student')
# 将数据存储为csv文件
df.to_csv('test2.csv',index=False)
# 指定分隔符
df.to_csv('test3.csv',index=False,sep='\t')
# 读取该文件
pd.read_csv('test2.csv')
8.Df之间HS运算(查询)
# select *
df[df['价格']>10000]
​
# 获取数据的一列或多列
df['列名']
df[['列1,列2']]
​
# 通过下标切片方式获取部分数据
df[a:b:c]
​
# 新降序排列
maxs=movie_df.sort_values(by='排序字段',ascending=False)
​
# 新升序排列
mins=movie_df.sort_values(by='排序字段',ascending=True)
​
# 求某字段中位数
zws=movie_df['字段名'].median()
​
# 计算某字段某值的出现次数
名称 = movie_df['字段名'].value_counts()
​
# 找到出现次数最多的某字段某值
max = 计算出现次数的名字.idxmax()
​
# 拿出行数据,用列展示,[]内是行列名,不是编号
df.loc[0]
df.loc[0,2,4]
df.loc[:,'列名'] #所有行
df.loc[:3] #0到3
df.loc[:3,:'列名'] # 列名也可以加:指定列FW
df.loc[:3,['列1','列2']]
df.loc[df['区域']=='望京租房',:'价格'] # 逗号前也可以作条件筛选
​
# 输出指定索引值的数据,[]内是编号,不是行列名,其他同上
值 = 带索引的表.iloc[0]['输出列名']
​
# 根据条件增新列
movie_df['pro']=movie_df['gross']-movie_df['budget']
​
# 根据某字段排序后显示其他字段
名称 = movie_df[['字段1','字段2']].sort_values(by='字段2',ascending=False).head()
​
# 根据某字段分组计数
名称 = movie_df['字段名'].value_counts()
​
# 提取最大值的索引
名称 = 计数表.idxmax()
​
# 提取最小值的索引
名称 = 计数表.idxmin()
​
# 把某一列数据作为索引
set_index(列名)
​
# 重置所以为从0开始的整数
reset_index()
​
# 在某列后插入一列
所有列名 = 表.columns.tolist() # 首先获取现有列名
某列的索引 = 所有列名.index('某列') # 找到budget列的索引位置
所有列名.insert(某列的索引 + 1, '新列名') # 在budget列之后插入利润列,更新所有列名
表 = 表[columns] # 重置列顺序来更新表
9.query查询(纯where筛选)
# 引号外单内双
df.query('区域=="望京租房"').head()
df.query('区域 in ["望京租房","回龙观租房"]')['单独取该列']
​
# 层层递进
tmp = df.query('区域 in ["望京租房","回龙观租房"]')
temp.query('朝向 in [“东”,"南”]')['单独取该列']
​
# 层层递进合成(类似于子查询)
df.query('区域 in ["望京租房","回龙观租房"]').query('朝向 in ["东","南"]')['单独取该列']
​
# 上式也能这么写
df.query('区域 in ["望京租房","回龙观租房"] and 朝向 in ["东","南"]')['单独取该列']
10.isin函数
# 筛选是否为指定数据,输出True和False
df['区域'].isin(['望京租房','回尨观租房'])
# 再传给df,输出所有字段
df[df['区域'].isin(['望京租房','回尨观租房'])]
# 多条件筛选(&或|)
df[(df['区域'].isin(['望京租房','回尨观租房'])) & (df['朝向'].isin(['西南 东北','南 北']))]
11.DF增列
# 添加新列,只能在最后一列
df['新列名']=['','',...]
# insert新增列,可指定位置
df.insert(列索引,column='字段名',value='字段内容')
12.DF删除
# 通过 df.drop(labels=,axis=,inplace=)方法删除行列数据
# labels: 行索引值或列名  
# axis: 删除行->0或index,删除列->1或columns,默认0
# inplace: True或False,是否在原数据上删除,默认 False
df.drop(0)
df.drop('省份',axis=1,inplace=True)
13.去重

subset 传入列名的列表,用来做重复判断的条件

keep =默认是first 满足重复条件的数据,保留第一次出现的,还可以选last 保留最后一次出现的

ignore_index=默认是False 去重后会保留原来的索引,改成True之后,会重新给从0开始的索引

inplace 替换

df.drop_duplicates(subset=['户型','朝向'])
df.drop_duplicates(subset=['户型','朝向'],keep='last',inplace=True)
df.drop_duplicates(subset=['户型','朝向'],keep='last',ignore_index=True)
14.DF修改
# 直接改
df.loc[0,'价格']= 4800
# 改多个
df['价格']=[4800,5800,6800,7800,8800]
# 修改指定数
df.replace(to_replace='东',value='北')
15.Series/apply自定义函数
def func(x):
    print(x)
    if x=='天通苑租房':
        return '昌平区'
    else:
        return x
# 遍历区域这一列,每遍历一条数据就会调用一次func把每个值传递给func函数,func函数的返回值作为apply的结果, 返回的还是Series
s = df['区域'].apply(func)
# apply 可以传递出了series值其它参数,但是传参必须从第二个参数开始
df_head3 = df.head().copy()
def func(x,arg1,arg2):
    print(x)
    if x=='天通苑租房':
        return arg1
    else:
        return arg2
df_head3['区域'].apply(func,args=['昌平区','其它区'])
16.DataF/apply自定义函数

df.apply(func,axis=默认值0)

  • 默认会传入每一列的series对象,如果数据有5列,func就会被调用5次,每次传入一列series对象

  • axis=1会传入每一行的Series对象,如果数据有10行,func就会被调用10次,每次传入一行的series对象

# 返回每一行它的价格/它的面积,但用列展示
def func1(x):
    return x['价格']/x['面积']
df_head3 = df.head().copy()
df_head3.apply(func1,axis=1)

df.apply() 传入自定义函数的时候,函数也可以接受额外的参数,传参args一定是列表

# 返回每一行如果区域为‘天通···’则给价格加个数,但用列展示
def func2(x,arg1):
    # print(x)
    # print("============") 分隔一下
    if x['区域']=='天通苑租房':
        x['价格']=x['价格']+arg1
    return x
df_head3.apply(func2,axis=1,args=[2000])
17.修改行列索引

set_index(列名)把某一列数据作为索引

reset_index() 重置所以为从0开始的整数

# 先截取某子表
df2 = df.loc[:,['区域','地址']].copy()
df2
# 将其行索引修改为对应的列值
df2.index = df2['区域']
df2
# 将其列索引修改为对应值
df2.columns =['area','addr']
df2
# 单独修改某行某列的索引,注意rename和之前replace类似,如果旧值没有找到,不会报错
df2.rename(index={0:'a'},columns={'addr':'地址'})
18.pandas/Mysql

(1)导包创建连接

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:root@localhost:3306/tabledata?charset=utf8')
# 'mysql+pymysql://用户名:密码@mysql服务IP地址:3306/数据库名字?charset=utf8'

(2)写入数据到Mysql

student.to_sql('student', con=engine, if_exists='append', index=False)

(3)从Mysql读取数据

pd.read_sql(sql='student', con=engine.connect(),columns=['id','name','age'])

讲义上写的是engine, 这里由于版本的问题, 需要使用engine.connect()

  • 31
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值