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
# 删除一列
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
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
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 |
---|
转载于:https://www.cnblogs.com/zheng1076/p/11453525.html