Pythonic 与相关类库使用方法
基础语法部分
Byte 字节转换为 string
1 | b"hello world".decode("utf-8") |
或者
1 | str(b"hello world", 'utf-8') |
数组初始化
一维数组初始化
1 | list = [0] * len(base_list) |
二维数组初始化
1 | array_2d_shared_element = [[0] * column_size] * row_size |
1 | array_2d_distinct_element = [[0 for i in xrange(column_size)] for j in xrange(row_size)] |
1 | import numpy as np |
获取list的安全操作
1 | def get(self, index): |
或者是自定义一个默认返回值:
1 | def get(self, index, default): |
遍历字符串的每个字符
1 | for i in range(len(str)): |
1 | for i, v in enumerate(str): |
三目表达式
1 | # condition ? rt_value : rt_value_else |
使用zip函数一个一个合并多个列表中的元素
1 | for item in zip([1, 2, 3], [4, 5, 6]) |
对zip函数再次使用zip函数可以将其恢复原状:
1 | for item in zip(*zip([1, 2, 3], [4, 5, 6])) |
对于 Python3来说zip函数会返回 iterator 对象,如果需要转换为list对象可以这样遍历操作:
1 | list_zipped = list(zip(*zip([1, 2, 3], [4, 5, 6]))) |
对于Python2来说会直接生成元素为tuple对象的列表(list)
序列解包 (sequence unpacking)
常规写法:
1 | first, second, third = 1, 2, 3 |
在实际编程中常见用法:
交换变量值
1 | a, b = b, a |
另外序列解包还会用到 *
号表达式:
1 | first, second, *rest = 1, 2 , 3, 4 |
1 | first, *mid, last = 1, 2, 3, 4 |
例子:
1 | zipped_twice = zip(*zip([1, 2, 3], [4, 5, 6])) |
我们都知道最里层的zip([1, 2, 3], [4, 5, 6])
生成的结果是 [(1, 4), (2, 5), (3, 6)]
如果我们想把list内部的元素作为多参数列表传入新的zip函数就要用到sequence unpacking *
换句话说就是zip(*zip([1, 2, 3], [4, 5, 6]))
等同于 zip((1,4), (2, 5), (3, 6))
关于sequence unpacking 的其他例子可以参看Python official document - Unpacking Argument Lists
数据结构
Stack
1 | from collections import deque |
Queue
Theard safe Queue
1 | queue = Queue() |
collections.deque
1 | from collections import deque |
left 是队列的head 部分, right是队列的tail位置
Map (dictionary)
- Get / Set
1 | map = dic() |
- foreach loop
1 | for key, value in local_map.item(): |
LinkedHashmap
1 | from collections import OrderedDict |
PriorityQueue (Heap)
1 | try: |
入队:
1 | pq.push((weight, value)) |
按weight出队:
1 | pq.get() |
- 为什么Python的PriorityQueue不支持 remove 操作?
- 为什么Python的priorityQueue peek 操作是什么?
动手解决这个问题:
1 | try: |
类库
Numpy
ndarray(N-dimensional array object)
为什么使用NumPy的数组结构而不使用Python内建List呢?
因为内建List的元素在系统内存中是分散存储的,而NumPy数组是存储在均匀连续的内存中的。
创建数组
1 | import numpy as np |
构建数组
1 | import numpy as np |
ufunc(universal function object)
连续数组的创建
1 | array_range = np.arange(1, 11, 2) |
数组运算
1 | array_range = np.arange(1, 11, 2) |
统计函数
数组、矩阵 最大值 amax 最小值 amin
1 | import numpy as np |
最大值与最小值之差ptp
1 | import numpy as np |
百分位数 percentile
1 | import numpy as np |
特别的对于50percentile数也就是 median中位数可以使用median, 对于平均数可以使用mean
1 | import numpy as np |
加权平均值 average
1 | import numpy as np |
统计标准差std、方差var
1 | import numpy as np |
排序sort
1 | import numpy as np |
Jupyter Notebook 参见 Github - dataAnalysis - basic_numpy_usage.ipynb
Panda
数据结构:Series DataFrame
Series - 定长的dictionary
它与dictionary最大的不同就是定长。
1 | from pandas import Series |
DataFrame
1 | from pandas import DataFrame |
数据导入和输出
1 | import pandas as pd |
数据清洗
常见的数据问题
删除DataFrame中的不必要行和列
1 | import pandas as pd |
重命名列名
1 | from pandas import DataFrame |
去除重复数据
1 | data = {'Chinese': [66, 95, 93, 90, 80, 80],'English': [65, 85, 92, 88, 90, 90],'Math': [30, 98, 96, 77, 90, 90]} |
数据格式问题
- 数据类型
1 | import numpy as np |
- 数据间空格
1 | from pandas import DataFrame |
- 大小写转换
1 | from pandas import DataFrame |
- 查找空值
1 | import pandas as pd |
使用apply函数进行数据清洗
- name 列大写
1 | import pandas as pd |
- Math 列数据 * 2
1 | import pandas as pd |
- 根据 Chinese 和 English 列计算产生两个新列
1 | import pandas as pd |
数据统计
1 | import pandas as pd |
数据表合并
- 按列名合并
1 | import pandas as pd |
- inner join
1 | import pandas as pd |
- left join
1 | import pandas as pd |
- right join
1 | import pandas as pd |
- outer join
1 | import pandas as pd |
用SQL的方式打开Pandas
1 | from pandas import DataFrame |
以上代码请参见Jupyter Notebook Github - dataAnalysis - basic pandas usage.ipynb