python学习笔记37:pandas

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
0 1 2
0 0 1 2
1 3 4 5
data = np.arange(6).reshape(2,3)
df_obj = pd.DataFrame(data,columns=['a','b','c'])
df_obj
a b c
0 0 1 2
1 3 4 5
# 增加一列
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
b c d
0 1 2 1
1 4 5 2
# 重置索引
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]
a b c d
0 0 1 2 3
# 多列,以列表方式传入
df_obj[['a','c']]
a c
0 0 2
1 4 6
2 8 10
# loc和iloc
df_obj.loc[:,['c','a']]
c a
0 2 0
1 6 4
2 10 8
df_obj.iloc[:,[2,0]]
c a
0 2 0
1 6 4
2 10 8

算术运算和数据对齐

# 先对齐在运算
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

posted @ 2019-09-03 15:52  zheng1076  阅读(865)  评论(0编辑  收藏  举报