首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据分析之路—python基础学习

数据分析之路—python基础学习

作者头像
23号杂货铺
发布2019-09-27 15:50:16
8960
发布2019-09-27 15:50:16
举报
文章被收录于专栏:23号杂货铺23号杂货铺

大数据分析、底层架构、设计思路,本文作者(大数据分析师——廉小宝)带你探路。 —— 23号老板

原创:a廉小宝

Python安装与使用

Python安装:直接安装Anaconda环境可以方便很多,Anaconda内置了很多Python包,使用起来很方便,另外推荐使用Python3版本,Python2目前已经停更。

推荐工具:一些小的实验可以在Jupyter Notebook上进行,工程项目可以使用Pycharm,方便调试 。 安装链接

python数据类型

1.基本数据类型

计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:

整数

Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。

计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

浮点数

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

字符串

字符串是以单引号’或双引号"括起来的任意文本,比如’abc’,“xyz"等等。请注意,’'或”“本身只是一种表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c这3个字符。如果’本身也是一个字符,那就可以用”"括起来,比如"I’m OK"包含的字符是I,’,m,空格,O,K这6个字符。

2.数据存储结构

list

Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

比如,一列数字,就可以用一个list表示:

a = [1,2,3,4,5]
print(a)

用索引来访问list中每一个位置的元素,记得索引是从0开始的:

print(a[0])
print(a[1:3])

记住list的索引范围是0:len(list)。

Tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。

a = (1, 2, 3, 4, 5)
print(a)
dict

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
a = dict(zip(names, scores))

dict也可以通过直接命名的方式定义,更为直接:

d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Bob']

通过检索dict的key可以直接访问其对应的value。

dict可以存储不同类型的数据,这是和前面的list和tuple完全不同的地方。

set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

重复元素在set中自动被过滤:

s = set([1, 1, 2, 2, 3, 3])
s

数据分析基础之Pandas

Pandas概述

Pandas 是一个 Python 的包,提供快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观。它旨在成为在Python中进行实际,真实世界数据分析的基础高级构建模块。此外,它还有更宏远的目标,即成为超过任何语言的最强大,最灵活的开源数据分析/操作工具。它已朝着这个目标迈进。

pandas非常适合许多不同类型的数据:

  • 具有异构类型列的表格数据,如SQL表或Excel电子表格。
  • 有序和无序(不一定是固定频率)时间序列数据。
  • 具有行和列标签的任意矩阵数据(均匀类型或异构)。
  • 任何其他形式的观察/统计数据集。实际上不需要将数据标记为放置在Pandas数据结构中。

Pandas 的两个主要数据结构,Series(1维)和DataFrame(2维),处理金融,统计,社会科学和许多工程领域中的绝大多数典型用例。对于R用户,DataFrame提供R的data.frame提供的所有内容以及更多内容。Pandas建立在NumPy之上,旨在与许多其他第三方库完美地集成在科学计算环境中。

以下是Pandas做够胜任的一些事情:

  • 在浮点和非浮点数据中轻松处理缺失数据(表示为NaN)。
  • 大小可变性:可以从DataFrame和更高维度的对象中插入和删除。
  • 自动和显式数据对齐:对象可以明确地与一组标签对齐,或者用户可以简单地忽略标签,让Series,DataFrame等在计算中自动对齐数据
  • 强大,灵活的组(group by)功能,可对数据集执行拆分应用组合操作,用于聚合和转换数据。
  • 轻松将其他Python和NumPy数据结构中的不规则,不同索引数据转换为DataFrame对象。
  • 基于智能标签的切片,花式索引和子集大数据集。
  • 直观合并和加入数据集。
  • 灵活的重塑和数据集的旋转。
  • 轴的分层标记(每个刻度可能有多个标签)。
  • 强大的IO工具,用于从平面文件(CSV和分隔)、Excel文件、数据库以及能从超快的HDF5格式中保存或加载数据。
  • 特定时间序列功能:日期范围生成和频率转换、移动窗口统计、移动窗口线性回归、日期转换和滞后等。

其中许多技术都是为了解决使用其他语言/科研环境时经常遇到的缺点。对于数据科学家来说,处理数据通常分为多个阶段:整理和清理数据,分析/建模数据,然后将分析结果组织成适合绘图或表格显示的形式。Pandas 是完成所有这些任务的理想工具。

Pandas操作

导入相关包


import pandas as pd
import numpy as np

对象创建

通过传入一些值的列表来创建一个Series,Pandas会自动创建一个默认的整数索引:

s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

通过传递带有日期时间索引和带标签列的NumPy数组来创建DataFrame:

dates = pd.date_range('20190725', periods=6)
dates
DatetimeIndex(['2019-07-25', '2019-07-26', '2019-07-27', '2019-07-28',
               '2019-07-29', '2019-07-30'],
              dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.rand(6,4),index=dates, columns=list('ABCD'))
df

A

B

C

D

2019-07-25

0.030035

0.364846

0.385114

0.892197

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-30

0.906944

0.143410

0.875313

0.430607

通过传递可以转化为类似Series的dict对象来创建DataFrame:

df2 = pd.DataFrame({
    'A': 1.,
    'B': pd.Timestamp('20190722'),
    'C': pd.Series(1, index=list(range(4)), dtype='float32'),
    'D': np.array([3] * 4, dtype='int32'),
    'E':pd.Categorical(["Luffy","Zoro","Nami","Robin"]),
    'F':'onepice'
})
df2

A

B

C

D

E

F

0

1.0

2019-07-22

1.0

3

Luffy

onepice

1

1.0

2019-07-22

1.0

3

Zoro

onepice

2

1.0

2019-07-22

1.0

3

Nami

onepice

3

1.0

2019-07-22

1.0

3

Robin

onepice

查看数据

df.head() # 查看起始的几个
df.tail() # 查看末尾的几个

A

B

C

D

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-30

0.906944

0.143410

0.875313

0.430607

df.index
DatetimeIndex(['2019-07-25', '2019-07-26', '2019-07-27', '2019-07-28',
               '2019-07-29', '2019-07-30'],
              dtype='datetime64[ns]', freq='D')
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
df.describe()

A

B

C

D

count

6.000000

6.000000

6.000000

6.000000

mean

0.457071

0.533592

0.533551

0.602658

std

0.385674

0.340186

0.182570

0.327549

min

0.030035

0.143410

0.385114

0.084260

25%

0.119012

0.321800

0.420294

0.451127

50%

0.452824

0.426720

0.469652

0.623721

75%

0.782250

0.825356

0.565715

0.852836

max

0.906944

0.959643

0.875313

0.961442

df.to_dict
<bound method DataFrame.to_dict of                    A         B         C         D
2019-07-25  0.030035  0.364846  0.385114  0.892197
2019-07-26  0.264333  0.959643  0.418979  0.512688
2019-07-27  0.829229  0.488593  0.424240  0.734755
2019-07-28  0.641315  0.307451  0.582599  0.084260
2019-07-29  0.070572  0.937610  0.515065  0.961442
2019-07-30  0.906944  0.143410  0.875313  0.430607>
Sorting by an axis:
df.sort_index(axis=1,ascending=False)

D

C

B

A

2019-07-25

0.892197

0.385114

0.364846

0.030035

2019-07-26

0.512688

0.418979

0.959643

0.264333

2019-07-27

0.734755

0.424240

0.488593

0.829229

2019-07-28

0.084260

0.582599

0.307451

0.641315

2019-07-29

0.961442

0.515065

0.937610

0.070572

2019-07-30

0.430607

0.875313

0.143410

0.906944

Sorting by values:
df.sort_values(by='C')

A

B

C

D

2019-07-25

0.030035

0.364846

0.385114

0.892197

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-30

0.906944

0.143410

0.875313

0.430607

标记

选择一个column:df[‘A’]或者df.A

Sorting by values:

.loc() 具有多种访问方式,如 -

  • 单个标量标签
  • 标签列表
  • 切片对象
  • 一个布尔数组

loc需要两个单/列表/范围运算符,用","分隔。第一个表示行,第二个表示列

df.loc[dates[0]]
A    0.030035
B    0.364846
C    0.385114
D    0.892197
Name: 2019-07-25 00:00:00, dtype: float64
df.loc[:,['A','B']]

A

B

2019-07-25

0.030035

0.364846

2019-07-26

0.264333

0.959643

2019-07-27

0.829229

0.488593

2019-07-28

0.641315

0.307451

2019-07-29

0.070572

0.937610

2019-07-30

0.906944

0.143410

df.loc['20190726':'20190728',['A','B']]

A

B

2019-07-26

0.264333

0.959643

2019-07-27

0.829229

0.488593

2019-07-28

0.641315

0.307451

.iloc()各种访问方式如下 -

  • 整数
  • 整数列表
  • 系列值
df.iloc[[1,2,4],[0,2]]

A

C

2019-07-26

0.264333

0.418979

2019-07-27

0.829229

0.424240

2019-07-29

0.070572

0.515065

df.iloc[1:3,:]

A

B

C

D

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

df.iloc[:,1:3]

B

C

2019-07-25

0.364846

0.385114

2019-07-26

0.959643

0.418979

2019-07-27

0.488593

0.424240

2019-07-28

0.307451

0.582599

2019-07-29

0.937610

0.515065

2019-07-30

0.143410

0.875313

使用一个column的值去选择数据:

df[df.A>0]

A

B

C

D

2019-07-25

0.030035

0.364846

0.385114

0.892197

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-30

0.906944

0.143410

0.875313

0.430607

df[df>0]

A

B

C

D

2019-07-25

0.030035

0.364846

0.385114

0.892197

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-30

0.906944

0.143410

0.875313

0.430607

通过label设置value:

df.at[dates[0], 'A'] = 0
df

A

B

C

D

2019-07-25

0.000000

0.364846

0.385114

0.892197

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-30

0.906944

0.143410

0.875313

0.430607

通过位置设置value:

df.iat[0,1] = 0
df

A

B

C

D

2019-07-25

0.000000

0.000000

0.385114

0.892197

2019-07-26

0.264333

0.959643

0.418979

0.512688

2019-07-27

0.829229

0.488593

0.424240

0.734755

2019-07-28

0.641315

0.307451

0.582599

0.084260

2019-07-29

0.070572

0.937610

0.515065

0.961442

2019-07-30

0.906944

0.143410

0.875313

0.430607

通过numpy数组来设置:

df.loc[:, 'D'] = np.array([5] * len(df))
df

A

B

C

D

2019-07-25

0.000000

0.000000

0.385114

5

2019-07-26

0.264333

0.959643

0.418979

5

2019-07-27

0.829229

0.488593

0.424240

5

2019-07-28

0.641315

0.307451

0.582599

5

2019-07-29

0.070572

0.937610

0.515065

5

2019-07-30

0.906944

0.143410

0.875313

5

缺失值

删除缺失数据

df.dropna(how='any')

A

B

C

D

2019-07-25

0.000000

0.000000

0.385114

5

2019-07-26

0.264333

0.959643

0.418979

5

2019-07-27

0.829229

0.488593

0.424240

5

2019-07-28

0.641315

0.307451

0.582599

5

2019-07-29

0.070572

0.937610

0.515065

5

2019-07-30

0.906944

0.143410

0.875313

5

填充/替换缺失数据

df.fillna(value=10)

A

B

C

D

2019-07-25

0.000000

0.000000

0.385114

5

2019-07-26

0.264333

0.959643

0.418979

5

2019-07-27

0.829229

0.488593

0.424240

5

2019-07-28

0.641315

0.307451

0.582599

5

2019-07-29

0.070572

0.937610

0.515065

5

2019-07-30

0.906944

0.143410

0.875313

5

判断是否有缺失值数据

pd.isna(df)

A

B

C

D

2019-07-25

False

False

False

False

2019-07-26

False

False

False

False

2019-07-27

False

False

False

False

2019-07-28

False

False

False

False

2019-07-29

False

False

False

False

2019-07-30

False

False

False

False

Apply

df.apply(np.cumsum)

A

B

C

D

2019-07-25

0.000000

0.000000

0.385114

5

2019-07-26

0.264333

0.959643

0.804092

10

2019-07-27

1.093562

1.448236

1.228332

15

2019-07-28

1.734877

1.755688

1.810931

20

2019-07-29

1.805448

2.693298

2.325995

25

2019-07-30

2.712393

2.836708

3.201309

30

df.apply(lambda x: x.max() - x.min())
A    0.906944
B    0.959643
C    0.490200
D    0.000000
dtype: float64

查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。

s = pd.Series(np.random.randint(0, 7, size=10))
s
0    3
1    3
2    4
3    4
4    2
5    2
6    0
7    6
8    4
9    5
dtype: int64
s.value_counts()
3    4
4    3
5    2
2    1
dtype: int64

合并

concat:

df3 = pd.DataFrame(np.random.randn(10, 4))
df3

0

1

2

3

0

0.546509

-0.645993

1.569857

-0.059439

1

3.143148

-0.357604

-0.610698

-1.032072

2

-0.593522

0.453311

0.033460

-1.163151

3

0.222209

0.542827

1.220938

0.540577

4

0.770124

-1.044302

-0.684126

0.990673

5

-0.324735

1.688151

1.202889

0.632073

6

0.385171

1.368965

-0.049633

0.697233

7

0.428143

0.012934

-0.745038

-0.570553

8

0.396524

0.804365

-1.310140

-0.246317

9

-0.438507

0.887196

1.272626

-2.558894

pieces = [df3[:3], df3[3:7], df3[7:]]
pieces
[          0         1         2         3
 0  0.546509 -0.645993  1.569857 -0.059439
 1  3.143148 -0.357604 -0.610698 -1.032072
 2 -0.593522  0.453311  0.033460 -1.163151,
           0         1         2         3
 3  0.222209  0.542827  1.220938  0.540577
 4  0.770124 -1.044302 -0.684126  0.990673
 5 -0.324735  1.688151  1.202889  0.632073
 6  0.385171  1.368965 -0.049633  0.697233,
           0         1         2         3
 7  0.428143  0.012934 -0.745038 -0.570553
 8  0.396524  0.804365 -1.310140 -0.246317
 9 -0.438507  0.887196  1.272626 -2.558894]
pd.concat(pieces)

0

1

2

3

0

0.546509

-0.645993

1.569857

-0.059439

1

3.143148

-0.357604

-0.610698

-1.032072

2

-0.593522

0.453311

0.033460

-1.163151

3

0.222209

0.542827

1.220938

0.540577

4

0.770124

-1.044302

-0.684126

0.990673

5

-0.324735

1.688151

1.202889

0.632073

6

0.385171

1.368965

-0.049633

0.697233

7

0.428143

0.012934

-0.745038

-0.570553

8

0.396524

0.804365

-1.310140

-0.246317

9

-0.438507

0.887196

1.272626

-2.558894

merge:

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
left

key

lval

0

foo

1

1

foo

2

right

key

rval

0

foo

4

1

foo

5

pd.merge(left, right, on='key')

key

lval

rval

0

foo

1

4

1

foo

1

5

2

foo

2

4

3

foo

2

5

append:

df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df

A

B

C

D

0

-0.580808

-0.929980

0.582348

-0.535886

1

-1.221695

-0.739676

-2.285674

1.760386

2

-0.105866

0.978615

0.793799

1.810907

3

-0.244317

0.806360

0.966249

0.662066

4

-0.134750

-0.596918

-0.260338

0.532753

5

-0.052537

1.517903

-1.092491

-0.634890

6

0.751423

-0.674670

-0.266553

-0.247528

7

0.677052

-1.403007

0.252095

-1.426274

s = df.iloc[4]
s
A   -0.134750
B   -0.596918
C   -0.260338
D    0.532753
Name: 4, dtype: float64
df.append(s, ignore_index=True)

A

B

C

D

0

-0.580808

-0.929980

0.582348

-0.535886

1

-1.221695

-0.739676

-2.285674

1.760386

2

-0.105866

0.978615

0.793799

1.810907

3

-0.244317

0.806360

0.966249

0.662066

4

-0.134750

-0.596918

-0.260338

0.532753

5

-0.052537

1.517903

-1.092491

-0.634890

6

0.751423

-0.674670

-0.266553

-0.247528

7

0.677052

-1.403007

0.252095

-1.426274

8

-0.134750

-0.596918

-0.260338

0.532753

分组

df = pd.DataFrame({'A': ['bao', 'xiao', 'bao', 'xiao',
                          'bao', 'xiao', 'bao', 'bao'],
                   'B': ['one', 'one', 'two', 'three',
                   'two', 'two', 'one', 'three'],
                   'C': np.random.randn(8),
                   'D': np.random.randn(8)
                  })
df

A

B

C

D

0

bao

one

0.213947

-0.725881

1

xiao

one

0.059765

0.279252

2

bao

two

0.331073

-0.106657

3

xiao

three

-1.168653

-0.493226

4

bao

two

1.149379

0.214320

5

xiao

two

-0.779205

-1.242145

6

bao

one

1.676725

-1.061910

7

bao

three

-0.085045

0.155202

df.groupby('A').sum()

C

D

A

bao

3.286079

-1.524925

xiao

-1.888093

-1.456119

数据输入/输出

CSV
df.to_csv('bao.csv')
pd.read_csv('bao.csv')

Unnamed: 0

A

B

C

D

0

0

bao

one

0.213947

-0.725881

1

1

xiao

one

0.059765

0.279252

2

2

bao

two

0.331073

-0.106657

3

3

xiao

three

-1.168653

-0.493226

4

4

bao

two

1.149379

0.214320

5

5

xiao

two

-0.779205

-1.242145

6

6

bao

one

1.676725

-1.061910

7

7

bao

three

-0.085045

0.155202

HDF5
df.to_hdf('bao.h5', 'df')
pd.read_hdf('bao.h5', 'df')

A

B

C

D

0

bao

one

0.213947

-0.725881

1

xiao

one

0.059765

0.279252

2

bao

two

0.331073

-0.106657

3

xiao

three

-1.168653

-0.493226

4

bao

two

1.149379

0.214320

5

xiao

two

-0.779205

-1.242145

6

bao

one

1.676725

-1.061910

7

bao

three

-0.085045

0.155202

Excle
df.to_excel('bao.xlsx', sheet_name='Sheet1')
pd.read_excel('bao.xlsx', 'Sheet1', index_col=None, na_values=['NA'])

A

B

C

D

0

bao

one

0.213947

-0.725881

1

xiao

one

0.059765

0.279252

2

bao

two

0.331073

-0.106657

3

xiao

three

-1.168653

-0.493226

4

bao

two

1.149379

0.214320

5

xiao

two

-0.779205

-1.242145

6

bao

one

1.676725

-1.061910

7

bao

three

-0.085045

0.155202

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 23号杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python安装与使用
  • python数据类型
    • 1.基本数据类型
      • 2.数据存储结构
      • 数据分析基础之Pandas
        • Pandas概述
          • Pandas操作
            • 导入相关包
            • 对象创建
            • 查看数据
            • 标记
            • 缺失值
            • Apply
            • 查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
            • 合并
            • 分组
            • 数据输入/输出
        相关产品与服务
        大数据
        全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档