数据分析7

本文详细介绍了使用Python进行数据分析的流程和技巧,包括数据预处理、数据探索、数据可视化以及使用pandas和numpy库进行复杂的数据操作。通过实例展示了如何利用Python进行高效的数据分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import numpy as np
import pandas as pd
from pandas import DataFrame

### 替换操作
- 替换操作可以同步作用于Series和DataFrame中
- 单值替换
    - 普通替换:  替换所有符合要求的元素:to_replace=15,value='e'
    - 按列指定单值替换: to_replace={列标签:替换值} value='value'
    
    
- 多值替换
    - 列表替换: to_replace=[]  value=[]
    - 字典替换(推荐)  to_replace={to_replace:value,to_replace:value}

df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df

df.replace(to_replace=2,value='Two')

df.replace(to_replace={1:'one'})

df.replace(to_replace={4:5},value='five')
#将指定列的元素进行替换to_replase={列索引:被替换的值}

### 映射操作
- 概念:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素值提供不同的表现形式)

- 创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名

dic = {
    'name':['张三','李四','张三'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)
df

#映射关系表
dic = {
    '张三':'tom',
    '李四':'jack'
}
df['e_name'] = df['name'].map(dic)
df

- map是Series的方法,只能被Series调用

### 运算工具

- 超过3000部分的钱缴纳50%的税,计算每个人的税后薪资

#该函数是我们指定的一个运算法则
def after_sal(s):#计算s对应的税后薪资
    return s - (s-3000)*0.5
    
df['after_sal'] = df['salary'].map(after_sal)#可以将df['salary']这个Series中每一个元素(薪资)作为参数传递给s
df

### 排序实现的随机抽样
- take()
- np.random.permutation()

df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
df

#生成乱序的随机序列
np.random.permutation(10)

#将原始数据打乱
df.take([2,0,1],axis=1)
df.take(np.random.permutation(3),axis=1)

df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50]

### 数据的分类处理
- 数据分类处理的核心:

    - groupby()函数
    - groups属性查看分组情况

df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})
df

#想要水果的种类进行分析
df.groupby(by='item')

#查看详细的分组情况
df.groupby(by='item').groups

- 分组聚合

#计算出每一种水果的平均价格
df.groupby(by='item')['price'].mean()

#计算每一种颜色对应水果的平均重量
df.groupby(by='color')['weight'].mean()

dic = df.groupby(by='color')['weight'].mean().to_dict()
#将计算出的平均重量汇总到源数据
df['mean_w'] = df['color'].map(dic)
df

### 高级数据聚合
- 使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
- df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
- transform和apply都会进行运算,在transform或者apply中传入函数即可
- transform和apply也可以传入一个lambda表达式

def my_mean(s):
    m_sum = 0
    for i in s:
        m_sum += i
    return m_sum / len(s)

df.groupby(by='item')['price'].transform(my_mean)

df.groupby(by='item')['price'].apply(my_mean)

### 数据加载

- 读取type-.txt文件数据

df = pd.read_csv('./data/type-.txt')
df

df.shape

- 将文件中每一个词作为元素存放在DataFrame中

pd.read_csv('./data/type-.txt',header=None,sep='-')

- 读取数据库中的数据

#连接数据库,获取连接对象
import sqlite3 as sqlite3
conn = sqlite3.connect('./data/weather_2012.sqlite')

#读取库表中的数据值
sql_df=pd.read_sql('select * from weather_2012',conn)
sql_df

#将一个df中的数据值写入存储到db
df.to_sql('sql_data456',conn)

### 透视表
- 透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table。

- 透视表的优点:
    - 灵活性高,可以随意定制你的分析计算要求
    - 脉络清晰易于理解数据
    - 操作性强,报表神器

import pandas as pd
import numpy as np
df = pd.read_csv('./data/透视表-篮球赛.csv',encoding='utf8')
df

#### pivot_table有四个最重要的参数index、values、columns、aggfunc

- index参数:分类汇总的分类条件
    - 每个pivot_table必须拥有一个index。如果想查看哈登对阵每个队伍的得分则需要对每一个队进行分类并计算其各类得分的平均值:

- 想看看哈登对阵同一对手在不同主客场下的数据,分类条件为对手和主客场

df.pivot_table(index=['对手','主客场'])

- values参数:需要对计算的数据进行筛选
    - 如果我们只需要哈登在主客场和不同胜负情况下的得分、篮板与助攻三项数据:

df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'])

- Aggfunc参数:设置我们对数据聚合时进行的函数操作
    - 当我们未设置aggfunc时,它默认aggfunc='mean'计算均值。


- 还想获得james harden在主客场和不同胜负情况下的总得分、总篮板、总助攻时:

df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')

- Columns:可以设置列层次字段
    - 对values字段进行分类

#获取所有队主客场的总得分
df.pivot_table(index='主客场',values='得分',aggfunc='sum')

#获取每个队主客场的总得分(在总得分的基础上又进行了对手的分类)
df.pivot_table(index='主客场',values='得分',columns='对手',aggfunc='sum',fill_value=0)

### 交叉表
- 是一种用于计算分组的特殊透视图,对数据进行汇总
- pd.crosstab(index,colums)
    - index:分组数据,交叉表的行索引
    - columns:交叉表的列索引

import pandas as pd
from pandas import DataFrame

df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],
               'age':[15,23,25,17,35,57,24,31,22],
               'smoke':[True,False,False,True,True,False,False,True,False],
               'height':[168,179,181,166,173,178,188,190,160]})
df

- 求出各个性别抽烟的人数

pd.crosstab(df.smoke,df.sex)

- 求出各个年龄段抽烟人情况

pd.crosstab(df.age,df.smoke)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值