Pandas数据分析介绍

0x00 环境准备

日常数据分析时,会遇到以下场景:

  • 线上大数据情景下,一般使用大数据平台分析。如:hadoop写代码,Hive写SQL,阿里云MaxCompute写SQL。
  • 本地Excel、csv等格式数据分析、处理情景。python工具库可以用来愉快地对数据进行分析和处理。(当然可以装1个本地数据库分析)

日常测试学习可以下个Anaconda数据分析集成环境,包含JupyterLab、Jupyter NoteBook、PyCharm等相关工具。并且安装了数据分析所需要的常见python库,不需要考虑依赖的问题。

  • Pandas库是数据分析工具库之一,处理Excel、CSV等文本格式文件非常方便,并且可以像写SQL一样对数据进行分析。
  • NumPy是强大的科学计算库。支持N维数组对象,复杂的代数运算。
  • matplotlib是强大的画图库,将数据分析结果可视化。

0x01 学习记录

首先,可以下载1个教程入门学习https://github.com/justmarkham/pycon-2019-tutorial。然后,通过Anaconda启动Jupyter NoteBook程序,打开tutorial.ipynb文件。

1. 读文件

读csv文件:

1
2
3
import pandas as pd
ted = pd.read_csv('ted.csv')
ted.head() # 输出前几行,看样例

读excel文件:

1
excel = pd.read_excel(excel_file) # 读入Excel数据。后面就和CSV文件1样,操作DataFrame即可。

不管什么格式的文件,读入后都变成了DataFrame对象。还支持SQLAlchemy读数据库、JSON格式数据,其他格式请看用户手册IO部分:https://pandas.pydata.org/docs/user_guide/io.html

2. 取数据

对数据操作时,会有2个概念:DataFrame和Series。官方文档描述:DataFrame是2维结构,DataFrame的每1列都是1个Series。

  • 按照column取数据
1
2
3
4
5
6
7
8
9
10
11
ted[['comments','duration']].describe()  # 选`comments`,`duiration`列进行快速统计摘要~ 

comments duration
count 2550.000000 2550.000000
mean 191.562353 826.510196
std 282.315223 374.009138
min 2.000000 135.000000
25% 63.000000 577.000000
50% 118.000000 848.000000
75% 221.750000 1046.750000
max 6404.000000 5256.000000
  • 定位单元格数据loc与iloc

loc使用label标签定位数据。dataframe.loc[row_label,col_label],使用row的标签(可以是数字或字符)和col标签定位数据。

1
2
3
ted.loc[2,'description']

'New York Times columnist David Pogue takes aim at technology’s worst interface-design offenders, and provides encouraging examples of products that get it right. To funny things up, he bursts into song.'

iloc使用行列数字位置定位。dataframe.iloc[row_num,col_num]

1
2
3
ted.iloc[3,1]

'In an emotionally charged talk, MacArthur-winning activist Majora Carter details her fight for environmental justice in the South Bronx -- and shows how minority neighborhoods suffer most from flawed urban policy.'

3. 合并数据

df1.append(df2)函数可以在dataframe后面增加另一个dataframe:

1
2
3
4
5
6
7
8
9
test = ted.loc[0:2,['comments','description']].append(ted.loc[5:6,['comments','description']])
test

comments description
0 4553 Sir Ken Robinson makes an entertaining and pro...
1 265 With the same humor and humanity he exuded in ...
2 124 New York Times columnist David Pogue takes aim...
5 672 Tony Robbins discusses the "invisible forces" ...
6 919 When two young Mormon missionaries knock on Ju...

df3= pd.concat([df1,df2])函数同样可以拼接2个DataFrame:

1
2
3
4
5
6
7
8
9
test = pd.concat([ted.loc[0:2,['comments','description']],ted.loc[5:6,['comments','description']]])
test

comments description
0 4553 Sir Ken Robinson makes an entertaining and pro...
1 265 With the same humor and humanity he exuded in ...
2 124 New York Times columnist David Pogue takes aim...
5 672 Tony Robbins discusses the "invisible forces" ...
6 919 When two young Mormon missionaries knock on Ju...

pd.merge(left,right,on='key')。merge函数和SQL的JOIN一样。

1
2
3
4
5
6
7
8
9
10
left = ted.loc[0:2,['description','comments']]
right = ted.loc[0:3,['description','main_speaker']]
pd.merge(left,right,on=['description'],how='left')


main_speaker description comments
0 Ken Robinson Sir Ken Robinson makes an entertaining and pro... 4553.0
1 Al Gore With the same humor and humanity he exuded in ... 265.0
2 David Pogue New York Times columnist David Pogue takes aim... 124.0
3 Majora Carter In an emotionally charged talk, MacArthur-winn... NaN

4. 筛选数据

pandas本地可以像SQL的where语句一样进行选择操作。

1
2
3
4
5
ted[(ted['comments']>=4000)&(ted['views']>=47220)]

comments description duration event film_date
0 4553 Sir Ken Robinson makes an entertaining and pro... 1164 TED2006 1140825600
96 6404 Richard Dawkins urges all atheists to openly s... 1750 TED2002 1012608000

5. apply和map

对单元格的统一处理,相比SQL就方便许多。

  • map函数只能针对series进行处理。可以传入字典或者1个参数的函数,对series的每个单元格进行处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def trans_comments(x):
if x>1000:
return "非常好"
elif x>500:
return "可以"
else:
return "继续努力"

ted['comments'].map(trans_comments)

0 非常好
1 继续努力
2 继续努力
3 继续努力
4 可以
...
2545 继续努力
2546 继续努力
2547 继续努力
2548 继续努力
2549 继续努力
Name: comments, Length: 2550, dtype: object
  • apply函数可以对series和DataFrame进行处理。
1
2
3
4
5
# 对series处理:将数字类型转换为STR字符串类型。对转成Excel用处很大。
ted['comments'].apply(str)

# 同样可以处理每个series单元格(可以传递多个参数)
ted['comments'].apply(trans_comments,args=())

DataFrame纵向统计总评论数:

1
2
3
4
5
import numpy as np
ted[['comments']].apply(np.sum,axis=0) # axis=0代表竖向,axis=1代表横向。 这里计算得出总评论数。

comments 488484
dtype: int64

DataFrame横向每行计算分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def trans_comments(series): // 传入对象是series
return series['comments']/series['duration']

ted[['comments','duration']].apply(trans_comments,axis=1)

0 3.911512
1 0.271238
2 0.096423
3 0.179211
4 0.498319
...
2545 0.035714
2546 0.020690
2547 0.015361
2548 0.029091
2549 0.015414
Length: 2550, dtype: float64
  • applymap函数可以对DataFrame每个单元格进行处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def trans_comments(x):
if x>1000:
return "大"
elif x>500:
return "中"
else:
return "小"

ted[['comments','duration']].applymap(trans_comments)


comments duration
0 大 大
1 小 中
2 小 大
3 小 大
4 中 大
... ... ...
2545 小 小
2546 小 小
2547 小 中
2548 小 大
2549 小 中

更复杂的用法,请参考Pandas 数据处理三板斧——map、apply、applymap 详解

6. 存储数据

Pandas可以将DataFrame转成各种常见格式。在技术和运营之间架起了桥梁。搬运官网支持的格式列表如下:

0x02 资料

Pandas指引
Pandas用户手册
Pandas 数据处理三板斧——map、apply、applymap 详解

文章作者: angelwhu
文章链接: https://www.angelwhu.com/paper/2020/03/15/Pandas-Data-Analysis-Introduction/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 angelwhu_blog