老男孩-数据分析 06 pandas高级操作

1.替换操作

●替换操作可以同步作用于Series和DataFrame中

df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
Out[241]: 
    0   1   2   3   4   5
0  57  33  53   6  32  54
1  11  68  31  27  48  77
2  13  80  80   8  50  46
3  23  55  35   4  44  89
4  10  20  13  10  95  39

●单值替换
■普通替换:替换所有符合要求的元素:o. replace=15,value=‘e’
■按列指定单值替换: to replace={列标签: 替换值} value=‘value’

#单值替换
df.replace(to_replace=6,value='six')
Out[243]: 
    0   1   2    3   4   5
0  57  33  53  six  32  54
1  11  68  31   27  48  77
2  13  80  80    8  50  46
3  23  55  35    4  44  89
4  10  20  13   10  95  39

●多值替换
■列表替换: to. replace=0 value=0
■字典替换(推荐) to. replace={to. replace:value,to replace:value}

#多值替换
df.replace(to_replace={6:'six',9:'nine'})
Out[244]: 
    0   1   2    3   4   5
0  57  33  53  six  32  54
1  11  68  31   27  48  77
2  13  80  80    8  50  46
3  23  55  35    4  44  89
4  10  20  13   10  95  39

#指定列的替换(将第二列的31替换成‘33311’)

df.replace(to_replace={2:31},value='33311')
Out[245]: 
    0   1      2   3   4   5
0  57  33     53   6  32  54
1  11  68  33311  27  48  77
2  13  80     80   8  50  46
3  23  55     35   4  44  89
4  10  20     13  10  95  39

2.映射

●概念:创建一个映射关系列表,把values元素和-个特定的标签或者字符串绑定(给一 个元素值提供不同的表现形式)
●创建一个df, 两列分别是姓名和薪资,然后给其名字起对应的英文名

from pandas import DataFrame,Series
dic = {'name':['张三','李四','王二麻子'],'salary':[15000,20000,22000]}
df = DataFrame(data=dic)
df
Out[253]: 
   name  salary
0    张三   15000
1    李四   20000
2  王二麻子   22000

1.map只是Series的函数,只能由Series调用

#映射关系表
dic_net = {'张三':'tom','李四':'jerry','王二麻子':'jacky'}
df['e_name']=df['name'].map(dic_net)
df
Out[257]: 
   name  salary e_name
0    张三   15000    tom
1    李四   20000  jerry
2  王二麻子   22000  jacky

2.map既能映射,还能充当运算工具

#超过2000的部分缴纳20%的税,计算税后薪资
def after_sal(s):
    ...:     if s <= 20000:
    ...:         return s
    ...:     else :
    ...:         return s - (s-20000)*0.2
    ...: df['after_sal'] = df['salary'].map(after_sal)
    ...: df
Out[269]: 
   name  salary e_name  after_sal
0    张三   15000    tom    15000.0
1    李四   20000  jerry    20000.0
2  王二麻子   22000  jacky    21600.0

3.DataFrame中的apply操作:将df中的运算作用到DataFrame的行或列中

df = DataFrame(data=np.random.randint(0,10,size=(5,3)))
df
Out[273]: 
   0  1  2
0  1  1  3
1  8  5  4
2  5  7  1
3  4  3  4
4  3  3  2

def my_add(value):
    ...:     return value+10
    ...: df.apply(my_add,axis=1)
Out[276]: 
    0   1   2
0  11  11  13
1  18  15  14
2  15  17  11
3  14  13  14
4  13  13  12

4.applymap操作:将df中的运算作用到DataFrame的每个元素

def my_add(value):
    ...:     return value+1000
    ...: df.applymap(my_add)
Out[279]: 
      0     1     2
0  1001  1001  1003
1  1008  1005  1004
2  1005  1007  1001
3  1004  1003  1004
4  1003  1003  1002

3.排序实现的随机抽样

take()
np.random.pemitation()

df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
df
Out[282]: 
     A   B   C
0    4  50  47
1   70  60   6
2   10  26  51
3   20  91  88
4    2  53  26
..  ..  ..  ..
95  70  44  37
96  37   7  99
97  76  11  37
98  78  49  34
99   2  81  28
[100 rows x 3 columns]

#将原始数据打乱(索引打乱)
#注意:indices只能作用于隐式索引

df.take(indices=[1,0,2],axis=1)#打乱列索引
								#打乱行索引
random_df = df.take(indices[1,0,2],axis=1).take(indices=np.random.permutation(100),axis=0)
random_df
Out[285]: 
     B   A   C
85  93  14  26
79  79  68  58
71  30  10  98
80  25  59  74
76  78  46  62
..  ..  ..  ..
93  22  60  80
12  17  84  66
94  12  25  86
32  75  30  62
65  36  19  34
[100 rows x 3 columns]

#随机抽样——对random_df切片

4.数据的分类处理

标题数据分组处理的核心:

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

求水果平均价格,并汇总到原数据中(分组计算,映射聚合):
step1:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

以上不推荐,
推荐写法:

在这里插入图片描述

step2:
在这里插入图片描述
在这里插入图片描述

5.高级数据聚合

在这里插入图片描述
在这里插入图片描述

6.数据加载

在这里插入图片描述

7.读取sql数据库中的数值

在这里插入图片描述
在这里插入图片描述

8.透视表

●透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大
功能,而在pandas中它被称作pivot. table。
●透视表的优点:
■灵活性高,可以随意定制你的分析计算要求
■脉络清晰易于理解数据
■操作性强,报表神器

import pandas as pd
import numpy as np
df = pd.read_csv('./data/透视表-篮球赛.csv',encoding='utf8')
df
		对手	胜负	主客场	命中	投篮数	投篮命中率	3分命中率	篮板	助攻	得分
0	勇士	胜	客	10	23	0.435	0.444	6	11	27
1	国王	胜	客	8	21	0.381	0.286	3	9	27
2	小牛	胜	主	10	19	0.526	0.462	3	7	29
3	灰熊	负	主	8	20	0.400	0.250	5	8	22
4	76人	胜	客	10	20	0.500	0.250	3	13	27
5	黄蜂	胜	客	8	18	0.444	0.400	10	11	27
6	灰熊	负	客	6	19	0.316	0.222	4	8	20
7	76人	负	主	8	21	0.381	0.429	4	7	29
8	尼克斯	胜	客	9	23	0.391	0.353	5	9	31
9	老鹰	胜	客	8	15	0.533	0.545	3	11	29
10	爵士	胜	主	19	25	0.760	0.875	2	13	56
11	骑士	胜	主	8	21	0.381	0.429	11	13	35
12	灰熊	胜	主	11	25	0.440	0.429	4	8	38
13	步行者	胜	客	9	21	0.429	0.250	5	15	26
14	猛龙	负	主	8	25	0.320	0.273	6	11	38
15	太阳	胜	客	12	22	0.545	0.545	2	7	48
16	灰熊	胜	客	9	20	0.450	0.500	5	7	29
17	掘金	胜	主	6	16	0.375	0.143	8	9	21
18	尼克斯	胜	主	12	27	0.444	0.385	2	10	37
19	篮网	胜	主	13	20	0.650	0.615	10	8	37
20	步行者	胜	主	8	22	0.364	0.333	8	10	29
21	湖人	胜	客	13	22	0.591	0.444	4	9	36
22	爵士	胜	客	8	19	0.421	0.333	5	3	29
23	开拓者	胜	客	16	29	0.552	0.571	8	3	48
24	鹈鹕	胜	主	8	16	0.500	0.400	1	17	26

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

1.index参数: 分类汇总的分类条件

——每个pivot _table必须拥有一个index.如果想查看哈登对阵每个队伍的得分则需要对每一个队进行分类并计算其各类得分的平均值:

#对阵同一对手在不同主客场下的数据,分类条件为对手和主客场

df.pivot_table(index=['对手','主客场'])
		3分命中率	助攻	命中	得分	投篮命中率	投篮数	篮板
对手	主客场							
76人	主	0.4290	7.0	8.0	29.0	0.381	21.0	4.0
客	0.2500	13.0	10.0	27.0	0.500	20.0	3.0
勇士	客	0.4440	11.0	10.0	27.0	0.435	23.0	6.0
国王	客	0.2860	9.0	8.0	27.0	0.381	21.0	3.0
太阳	客	0.5450	7.0	12.0	48.0	0.545	22.0	2.0
小牛	主	0.4620	7.0	10.0	29.0	0.526	19.0	3.0
尼克斯	主	0.3850	10.0	12.0	37.0	0.444	27.0	2.0
客	0.3530	9.0	9.0	31.0	0.391	23.0	5.0
开拓者	客	0.5710	3.0	16.0	48.0	0.552	29.0	8.0
掘金	主	0.1430	9.0	6.0	21.0	0.375	16.0	8.0
步行者	主	0.3330	10.0	8.0	29.0	0.364	22.0	8.0
客	0.2500	15.0	9.0	26.0	0.429	21.0	5.0
湖人	客	0.4440	9.0	13.0	36.0	0.591	22.0	4.0
灰熊	主	0.3395	8.0	9.5	30.0	0.420	22.5	4.5
客	0.3610	7.5	7.5	24.5	0.383	19.5	4.5
爵士	主	0.8750	13.0	19.0	56.0	0.760	25.0	2.0
客	0.3330	3.0	8.0	29.0	0.421	19.0	5.0
猛龙	主	0.2730	11.0	8.0	38.0	0.320	25.0	6.0
篮网	主	0.6150	8.0	13.0	37.0	0.650	20.0	10.0
老鹰	客	0.5450	11.0	8.0	29.0	0.533	15.0	3.0
骑士	主	0.4290	13.0	8.0	35.0	0.381	21.0	11.0
鹈鹕	主	0.4000	17.0	8.0	26.0	0.500	16.0	1.0
黄蜂	客	0.4000	11.0	8.0	27.0	0.444	18.0	10.0

2.values参数:需要对计算的数据进行筛选

如果我们只需要哈登在主客场和不同胜负情况下的得分、篮板与助攻三项数据:

df.pivot_table(index=['主客场','胜负'],values =['得分','篮板','助攻'])
Out[25]: 
               助攻         得分        篮板
主客场 胜负                                
主   胜   10.555556  34.222222  5.444444
    负    8.666667  29.666667  5.000000
客   胜    9.000000  32.000000  4.916667
    负    8.000000  20.000000  4.000000

3.Aggfunc参数:设置我们对数据聚合时进行的函数操作

当我们未设置aggfunc时,它默认aggfunc='mean’计算均值。

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

df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')
Out[26]: 
         助攻   得分  篮板
主客场 胜负              
主   胜    95  308  49
    负    26   89  15
客   胜   108  384  59
    负     8   20   4

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

#获取所有队主客场的总得分
df.pivot_table(index='主客场',values='得分',aggfunc='sum')
Out[27]: 
      得分
主客场     
主    397
客    404

#获取每个队主客场的总得分(在总得分的基础上又进行了对手的分类)
df.pivot_table(index='主客场',values='得分',columns='对手',aggfunc='sum',fill_value=0)
Out[28]: 
对手   76人  勇士  国王  太阳  小牛  尼克斯  开拓者  掘金  步行者  湖人  灰熊  爵士  猛龙  篮网  老鹰  骑士  鹈鹕  黄蜂
主客场                                                                            
主     29   0   0   0  29   37    0  21   29   0  60  56  38  37   0  35  26   0
客     27  27  27  48   0   31   48   0   26  36  49  29   0   0  29   0   0  27

9.交叉表

  • 是一种用于计算分组的特殊透视图,对数据进行汇总

  • pd.crosstab(index,colums)

  • index:分组数据,交叉表的行索引

  • columns:交叉表的列索引
    .
    0

      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
      	sex	age	smoke	height
      0	man	15	True	168
      1	man	23	False	179
      2	women	25	False	181
      3	women	17	True	166
      4	man	35	True	173
      5	women	57	False	178
      6	man	24	False	188
      7	women	31	True	190
      8	women	22	False	160
    
      求出各个性别抽烟的人数
      
      pd.crosstab(df.smoke,df.sex)
      sex	man	women
      smoke		
      False	2	3
      True	2	2
      
      求出各个年龄段抽烟人情况
      
      pd.crosstab(df.age,df.smoke)
      
      smoke	False	True
      age		
      15	0	1
      17	0	1
      22	1	0
      23	1	0
      24	1	0
      25	1	0
      31	0	1
      35	0	1
      57	1	0
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值