pandas
series:一维数据结构
dataframe:二维数据结构
import pandas as pd
Series方式
参数说明:
- data
- index 索引
- name 名称
- copy 是否复制
- dtype 数据类型
ser_obj = pd.Series([1,2,3])
ser_obj
0 1
1 2
2 3
dtype: int64
# 指定索引
ser_obj = pd.Series([1,2,3],index=['a','b','c'])
ser_obj
a 1
b 2
c 3
dtype: int64
# 从字典创建
dit = {2001:100,2002:200,2003:150}
ser_obj1 = pd.Series(dit)
ser_obj1
2001 100
2002 200
2003 150
dtype: int64
Dataframe方式
参数说明:
- data
- index 索引
- columns 行索引
- copy 是否复制
- dtype 数据类型
import numpy as np
data = np.arange(6).reshape(2,3)
df_obj = pd.DataFrame(data)
df_obj
data = np.arange(6).reshape(2,3)
df_obj = pd.DataFrame(data,columns=['a','b','c'])
df_obj
# 增加一列
df_obj['d'] = [1,2]
df_obj
|
a |
b |
c |
d |
0 |
0 |
1 |
2 |
1 |
1 |
3 |
4 |
5 |
2 |
# 删除一列
del df_obj['a']
df_obj
# 重置索引
ser_obj1 = pd.Series([1,2,3,4],index=['c','b','a','d'])
ser_obj1
c 1
b 2
a 3
d 4
dtype: int64
# fill_value会让所有缺失值都用同一个值填充
ser_obj2 = ser_obj1.reindex(['a','b','c','d','e','f'],fill_value=5)
ser_obj2
a 3
b 2
c 1
d 4
e 5
f 5
dtype: int64
# ffill\pad 前向填充值
# bfill\backfill 后向填充值
# nearest 从最近的索引值填充
ser_obj3 = pd.Series([1,3,5,7], index=[0,2,4,6])
ser_obj3
0 1
2 3
4 5
6 7
dtype: int64
ser_obj3.reindex([1,2,3,4,5,6],method='bfill')
ser_obj3
0 1
2 3
4 5
6 7
dtype: int64
索引
arr = np.arange(12).reshape(3,4)
df_obj = pd.DataFrame(arr, columns=['a','b','c','d'])
df_obj
|
a |
b |
c |
d |
0 |
0 |
1 |
2 |
3 |
1 |
4 |
5 |
6 |
7 |
2 |
8 |
9 |
10 |
11 |
df_obj['a']
0 0
1 4
2 8
Name: a, dtype: int64
df_obj[0:1]
# 多列,以列表方式传入
df_obj[['a','c']]
# loc和iloc
df_obj.loc[:,['c','a']]
df_obj.iloc[:,[2,0]]
算术运算和数据对齐
# 先对齐在运算
obj_one = pd.Series(range(10,13),index=range(3))
obj_one
0 10
1 11
2 12
dtype: int64
obj_two = pd.Series(range(10,16),index=range(6))
obj_two
0 10
1 11
2 12
3 13
4 14
5 15
dtype: int64
# 没有用NaN补充,也可以设置fill_value
obj_one + obj_two
0 20.0
1 22.0
2 24.0
3 NaN
4 NaN
5 NaN
dtype: float64
obj_one.add(obj_two,fill_value=0)
0 20.0
1 22.0
2 24.0
3 13.0
4 14.0
5 15.0
dtype: float64
数据排序
# 按索引
ser_obj = pd.Series(range(10,13),index=range(3))
ser_obj
0 10
1 11
2 12
dtype: int64
ser_obj.sort_index(ascending=False)
2 12
1 11
0 10
dtype: int64
参数说明:
- axis 0 行1列
- level 指定索引级别排序
- ascending 默认升
- inplace 默认False,不创建新的实例
- kind 排序算法,如quicksort
# 按值
ser_obj = pd.DataFrame(np.arange(12).reshape(3,4))
ser_obj
|
0 |
1 |
2 |
3 |
0 |
0 |
1 |
2 |
3 |
1 |
4 |
5 |
6 |
7 |
2 |
8 |
9 |
10 |
11 |
ser_obj[4] = [12,3,2]
ser_obj
|
0 |
1 |
2 |
3 |
4 |
0 |
0 |
1 |
2 |
3 |
12 |
1 |
4 |
5 |
6 |
7 |
3 |
2 |
8 |
9 |
10 |
11 |
2 |
ser_obj.sort_values(by=4)
|
0 |
1 |
2 |
3 |
4 |
2 |
8 |
9 |
10 |
11 |
2 |
1 |
4 |
5 |
6 |
7 |
3 |
0 |
0 |
1 |
2 |
3 |
12 |
常用统计计算
- sum 和
- mean 均值
- medium 中值
- idxmax 最大值索引
- idxmin
- count 非NaN的值的个数
- var 样本方差值
- std 标准差
- cumsum 累计求合
- cumprod 累计求积
- describe 列计算汇总统计
层次化索引
df_obj = pd.DataFrame({'学生数':[1,2,3,4]},
index=[['学校1','学校1','学校2','学校2'],['班级1','班级2','班级1','班级2']])
df_obj
|
|
学生数 |
学校1 |
班级1 |
1 |
班级2 |
2 |
学校2 |
班级1 |
3 |
班级2 |
4 |
from pandas import MultiIndex
# 三种转化为层次索引的方法
# MultiIndex.from_arrays
# MultiIndex.from_product
# MultiIndex.from_tuples
# 方式1
list_tuple = [('学校1','班级1'),('学校1','班级2'),('学校2','班级1'),('学校2','班级2')]
m_index = MultiIndex.from_tuples(tuples=list_tuple)
m_index
MultiIndex(levels=[['学校1', '学校2'], ['班级1', '班级2']],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]])
df_obj = pd.DataFrame({'学生数':[1,2,3,4]},
index = m_index)
df_obj
|
|
学生数 |
学校1 |
班级1 |
1 |
班级2 |
2 |
学校2 |
班级1 |
3 |
班级2 |
4 |
# 方式2
schools = ['学校1', '学校2']
classes = ['班级1', '班级2']
m_index = MultiIndex.from_product(iterables=[schools,classes])#,names=['school','class'])
df_obj = pd.DataFrame({'学生数':[1,2,3,4]},
index = m_index)
df_obj
|
|
学生数 |
学校1 |
班级1 |
1 |
班级2 |
2 |
学校2 |
班级1 |
3 |
班级2 |
4 |
层次索引操作
# df_obj['学校1']
读写
- pd.read_csv() 默认使用“,”做分割符号
- pd.to_csv()
- pd.read_table() 默认使用“\t”做分割符号
- pd.read_excel()
# 由于表格有多个列标题,所以用header=[0,1]表示前两行都是列标签
df_obj = pd.read_excel('scores.xlsx',header=[0,1],index_col=0)
df_obj
年份 |
一本分数线 |
二本分数线 |
|
文科 |
理科 |
文科 |
理科 |
2018 |
576 |
532 |
488 |
432 |
2017 |
555 |
537 |
468 |
439 |
2016 |
583 |
548 |
532 |
494 |
2015 |
579 |
548 |
527 |
495 |
2014 |
565 |
543 |
507 |
495 |
2013 |
549 |
550 |
494 |
505 |
2012 |
495 |
477 |
446 |
433 |
2011 |
524 |
484 |
481 |
435 |
2010 |
524 |
494 |
474 |
441 |
2009 |
532 |
501 |
489 |
459 |
2008 |
515 |
502 |
472 |
455 |
2007 |
528 |
531 |
486 |
478 |
2006 |
516 |
528 |
476 |
476 |
# 获取历年文理科最高和最低分数线及极差
df_obj.max()
年份
一本分数线 文科 583
理科 550
二本分数线 文科 532
理科 505
dtype: int64
df_obj.min()
年份
一本分数线 文科 495
理科 477
二本分数线 文科 446
理科 432
dtype: int64
df_obj["一本分数线","文科"].ptp()
/Users/zxx/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Method .ptp is deprecated and will be removed in a future version. Use numpy.ptp instead.
"""Entry point for launching an IPython kernel.
88
df_obj.describe()
年份 |
一本分数线 |
二本分数线 |
|
文科 |
理科 |
文科 |
理科 |
count |
13.000000 |
13.000000 |
13.000000 |
13.000000 |
mean |
541.615385 |
521.153846 |
487.692308 |
464.384615 |
std |
28.150010 |
25.986683 |
23.570407 |
27.274953 |
min |
495.000000 |
477.000000 |
446.000000 |
432.000000 |
25% |
524.000000 |
501.000000 |
474.000000 |
439.000000 |
50% |
532.000000 |
531.000000 |
486.000000 |
459.000000 |
75% |
565.000000 |
543.000000 |
494.000000 |
494.000000 |
max |
583.000000 |
550.000000 |
532.000000 |
505.000000 |