数据分析1 - 数据准备

数据类型

  • python 的定义、赋值与变量
  • 变量名的命名规则
  • 三种常用的数据类型:逻辑型、数值型、字符型

逻辑型:&, |, not

数值型的运算:+, -, *, /, %, // 取整除, **乘方

浮点数的精算:(使用 decimal 包中的 Decimal)

from decimal import Decimal
a = Decimal('4.2')
b = Decimal('2.1')
(a + b) == Decimal('6.3')

字符型:
使用 \ 转义特殊字符,还可作为续行符

字符串前面加上 r 可使字符串视为原始字符:r'C:\some\name'

使用 """..."""'''...''' 可跨越多行

数据结构——特定关系的集合

数据结构的学习方法:概念、定义、限制、访问、修改

pandas 包中的数据结构:Series(系列)DataFrame(数据框)

  • Series —— 存储一行或一列数据,没列名,有索引
from pandas import Series

# 定义,元素类型可混合,索引默认从0开始
x = Series(
            ['a', True, 1]
        )
# 定义,可为 Series 指定一个名字
x = Series(
            ['a', True, 1],
            name='test'
        )
# 定义,指定索引列
x = Series(
            ['a', True, 1],
            index = ['first', 'second', 'third']
        )
        
# 访问,通过索引访问元素
x[1]
x['first']

# 追加,不能追加单个元素,而是一个 Series 。append 方法并不直接修改,而是返回一个新的 Series
n = Series(['2'])
x = x.append(n)

# 判断 Series 是否包含元素
# 错误:'2' in x
# series.values 的类型是 numpy.ndarray ,表示一个 array
'2' in x.values

# 获取子 Series —— 切片
# 包左不包右
x[1:3]
# 从索引中获取切片
x[[0, 2, 1]]

# 删除
# 如果有指定索引,这里不能用默认的索引:0,1,2,3……来删除了
x.drop('first')
# 如果追加了两次元素,且没有指定索引,则两次索引均从0开始,即索引重复,此时会找不到对应 index 
x.drop(x.index[3])
# 返回元素值不为 '2' 的 Series,即剔除
x['2' != x.values]
  • DataFrame —— 存储多行或多列,有列名(字段名),有索引(从0开始),元素的位置是[3, 2](从1开始,三行二列)。DataFrame 可以被看做成 Series 的字典
from pandas import DataFrame

# 定义
df = DataFrame({
            'age': [21,22,23],
            'name':['ken', 'john', 'jay']
        })
df = DataFrame(
            data={
                'age': [21,22,23],
                'name':['ken', 'john', 'jay']
            },
            index=['first', 'second', 'third']
        )
   
# 访问
# 访问单列 —— 根据字段名,获取一个 Series
df['age']
# 访问多列 —— 根据字段名 list,获取一个 DataFrame
df[['age', 'name']]
# 访问行 —— 切片方式,获取一个 DataFrame
# 错误:df[1]
df[1:2]
# 访问单行 —— 索引方式,获取一个 Series
df.loc['first']
# 访问多行 —— 索引方式,获取一个 DataFrame
df.loc[['first', 'second']]
# 按行列号访问 —— 切片方式,获取一个 DataFrame,第一个切片指行,第二个切片指列
df.iloc[0:1, 0:2]
# 访问元素 —— 按行索引和列名
df.at['first', 'name']
# 行遍历
# df.iterrows() 是一个 generator 
# index 是 df 的索引的值
# row 是一个 Series,df 的列名变成 row 的索引
for index, row in df.iterrows():

# 修改列名
df.columns = ['age2', 'name2']
# 修改索引
df.index = range(1, 4)
# 使原来用于索引的字段重新变成字段,而加入的索引从0,1,2,... 开始
df.reset_index()

# 删除。axis=0 为行,1为列,默认为 axis=0
df.drop('first', axis=0)
df.drop('age', axis=1)

# 增加
# 增加行(这种方式效率低,不应用于遍历中)
df.loc[len(df)] = [24, "andy"]
# 增加列
df['newColumn'] = [2,4,6,8]


向量化运算

一种特殊的并行计算方式,可在同时执行多次操作,通常是对不同数据执行同样的一个或一批指令,或者说把指令应用于一个数组 / 向量中

生成等差数列:numpy.arange(start, end, step)

# py 原生只能生成整数,读取只能 for 循环
r1_10 = range(1,11,2)
for i in r1_10:
    print(i)

import numpy
# r 类型是 numpy.ndarray,即一个 array
r = numpy.arange(0.1, 0.5, 0.01)
  • 向量化运算的四则运算

规则:相同位置的数据进行运算,结果保留在相同位置

原则:1. 代码中尽量避免显式的 for 循环;2. 过早的优化是魔鬼

r+r
r-r
r*r
r/r

# 函数式的向量化计算
# r的5次方
numpy.power(r,5)

# 比较运算,返回 boolean 值的向量,大小与 r 相同
r > 0.3
# 比较运算 结合 过滤 使用,根据传入的 boolean 值的向量,保留值为 True 的对应的值重新组成向量
r[r>0.3]

# 矩阵运算
# 矩阵相乘
# r 和 r 的转置相乘
numpy.dot(r, r.T)
# 效果同下
sum(r*r)
  • DataFrame 的向量运算 —— 把 DataFrame 的一行或一列看成向量
# 定义
# numpy.random 用于生成随机数
# numpy.random.randn(5) 表示生成5个具有标准正态分布的值组成 array
# # numpy.random.randn(2,4) 表示生成结构为 array[array[4个元素], array[4个元素]]
df = DataFrame({
            'col1':numpy.random.randn(5),
            'col2':numpy.random.randn(5)
        })

# 获取最小值
# axis=0 按列获取,axis=1 按行获取。默认 axis=0
# 返回一个 Series,axis=0 时索引为df 的列名,axis=1 索引为 df 的索引
# min 为计算的函数,表示取最小值
df.apply(min)
df.apply(min, axis=0)
df.apply(min, axis=1)

# 判断每一行,值是否都大于0
# numpy.all(array) 判断传进来的向量是否值都为 True
df.apply(
            lambda x: numpy.all(x>0),
            axis=1
        )

# df.apply 用于过滤 dataFrame 的行数据
df[df.apply(
            lambda x: numpy.all(x>0),
            axis=1
        )]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容