Python学习(三)pandas包

1.简介

pandas 是 python 中基于 numpy 和 matplotlib 的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包。

2.数据对象

2.1 Series 对象

2.1.1 参数

  • index:标签信息,未指定索引默认从0开始的自然数
  • values:保存元素值的 ndarray 数组

创建 Series 对象

# TODO:创建series对象
import pandas as pd

#1.未指定index,series对象则默认生成index
series1 = pd.Series([2, 3, 5, 9])
print("未指定索引的series1:\n", series1)

#2.指定index, series对象的index则按照指定的进行生成
series2 = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print("指定索引的series2:\n", series2)

运行结果
未指定索引的series1:
0    2
1    3
2    5
3    9
指定索引的series2:
a    1
b    2
c    3
d    4
e    5

2.1.2 操作说明

  • 访问 series 对象同时支持位置和标签形式
  • 支持位置切片和标签切片
  • +:对标签相同的元素进行加法计算,另一方不存在时,以 NAN 填充
  • isnull / notnull 检测数据是否为空

2.2 DataFrame 对象

2.2.1 参数

  • data:数据
  • index:行索引
  • column:列索引
  1. 用字典创建 DataFrame 对象
# TODO: 字典生成 DataFrame
import pandas as pd

# 字典创建dataFrame
# 字典的"键"是列名
# 字典"键"的值是一个列表
# DataFrame没有指定索引会默认生成
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
print("DataFrame:\n", frame)

# DataFrame 对象拥有行索引(可以有多级索引)index和列索引columns
print("DataFrame的行索引:", frame.index)
print("DataFrame的列索引:", frame.columns)
print("DataFrame的行索引0:", frame.index[0])
print("DataFrame的列索引2:", frame.columns[2])

# 给一个不存在的列赋值,将会创建一个新的列。
frame["day"] = None
print(frame)
# 像字典一样 del 关键字将会删除列:
del frame["day"]
print(frame)

运行结果
DataFrame:
     state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9

DataFrame的行索引: RangeIndex(start=0, stop=5, step=1)
DataFrame的列索引: Index(['state', 'year', 'pop'], dtype='object')
DataFrame的行索引0: 0
DataFrame的列索引2: pop

    state  year  pop   day
0    Ohio  2000  1.5  None
1    Ohio  2001  1.7  None
2    Ohio  2002  3.6  None
3  Nevada  2001  2.4  None
4  Nevada  2002  2.9  None

    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
  1. 用ndarray创建DataFrame
# TODO:用ndarray创建DataFrame对象
frame1 = pd.DataFrame(np.random.randint(0, 10, (4, 2)), index=['A', 'B', 'C', 'D'], columns=['a', 'b'])
print("用ndarray创建DataFrame:\n", frame1)

运行结果
用ndarray创建DataFrame:    
   a  b
A  9  1
B  4  7
C  2  4
D  5  0

2.3 Index 对象

index 对象保存索引标签数据,可以当作一维数组,只读。

# 通过values属性获得保存标签的数组
import pandas as pd

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
index = frame.columns
print("\n", frame)
print("frame列标签:", index)
print("frame列标签的值:", index.values)

# Index 对象也有字典的映射功能,将值映射到键的位置:
print(index.get_loc('state'))
print(index.get_indexer(['state', 'year']))

运行结果
     state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
frame列标签: Index(['state', 'year', 'pop'], dtype='object')
frame列标签的值: ['state' 'year' 'pop']
0
[0 1]

2.4 Multindex 对象

MultiIndex表示多级索引,它从Index继承,其中的多级标签采用元组对象来表示

创建MultiIndex的4种方法:

  • pandas.MultiIndex.from_arrays :从数组创建
  • pandas.MultiIndex.from_product:从笛卡尔积创建
  • pandas.MultiIndex.from_tuples :从元组创建
  • pandas.MultiIndex.from_frame :由DataFrame对象创建
import pandas as pd
import numpy as np

# 从数组创建
class1 = ["A", "A", "B", "B"]
class2 = ["x", "y", "x", "y"]
m_arr = pd.MultiIndex.from_arrays([class1, class2],names=["class1", "class2"])
df1 = pd.DataFrame(np.random.randint(0, 10, (4, 4)), columns=m_arr, index=m_arr)
print(df1)

# 从笛卡尔积创建
m_pro = pd.MultiIndex.from_product([["A", "B", "C"], ["x", "y"]], names=["class1", "class2"])
df2 = pd.DataFrame(np.random.randint(0, 10, (6, 6)), columns=m_pro, index=m_pro)
print(df2)

# 从元组创建
m_tup = pd.MultiIndex.from_tuples([("A","x1"),("A","x2"),("B","y1"),("B","y2"),("B","y3")],name=["class1","class2"])
df3 = pd.DataFrame(np.random.randint(0, 10, (5, 5)), columns=m_tup, index=m_tup)
print(df3)

运行结果
class1         A     B   
class2         x  y  x  y
class1 class2            
A      x       0  4  9  9
       y       9  2  2  4
B      x       5  1  8  4
       y       4  6  9  7
       
class1         A     B     C   
class2         x  y  x  y  x  y
class1 class2                  
A      x       1  0  3  6  2  5
       y       0  0  6  3  9  2
B      x       4  5  7  4  8  0
       y       7  8  2  3  3  0
C      x       7  7  5  4  9  8
       y       4  8  7  9  9  9
       
class1         A     B      
class2        x1 x2 y1 y2 y3
class1 class2               
A      x1      0  3  9  6  7
       x2      2  9  7  0  3
B      y1      6  3  8  4  5
       y2      9  7  2  2  8
       y3      6  9  6  5  3

3.下标存取

3.1 [ ] 操作符

  • 单个索引标签: 获取对应的列,返回一个Series对象。name是列索引名,index是行索引,values是数值。
  • 多个索引标签: 获取以列表、数组表示的多个标签对应的列,返回一个DataFrame 对象。
  • 整数切片:以整数下标获取切片对应的行,不包含终值的行。
  • 标签切片:当使用标签作为切片时包含终值。
  • 布尔数组:获取数组中 True 对应的行
import numpy as np
import pandas as pd

# TODOl下标存取
# []操作符
A = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['Ohio', 'Texas', 'California'])
print(A)

# 单个索引标签:获取对应的列,返回一个Series对象:name是列索引名,index是行索引,values是数值
# 在此基础上,使用两个[col][row]时可返回对应位置的元素
# 行索引可以用标签也可以用整数索引,列标签只能用标签索引
print("单个列索引标签:\n", A['Ohio'])
print("单个列索引标签的行索引:", A['Ohio'].index)
print("单个列索引标签的值:", A['Ohio'].values)
print("单个列标签索引的列名:", A['Ohio'].name)

# 多个索引标签: 获取以列表、数组表示的多个标签对应的列,返回一个DataFrame 对象。
C = A[['Ohio', 'Texas']]
print("多个列索引标签:\n", C)
print("多个列索引标签返回值类型:", type(C))

# 整数切片:以整数下标获取切片对应的行,不包含终值的行。  数值就是
print("整数切片:\n", A[0:2])
# 标签切片:当使用标签作为切片时包含终值
print("标签切片:\n", A['a':'c'])
# 布尔数组:获取数组中True对应的行
print("获取数组中True对应的行:\n", A[A.Ohio > 0])

运行结果
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

单个列索引标签:
a    0
c    3
d    6
Name: Ohio, dtype: int32
单个列索引标签的行索引:Index(['a', 'c', 'd'], dtype='object')
单个列索引标签的值:[0 3 6]
单个列标签索引的列名: Ohio

多个列索引标签:    
    Ohio  Texas
a     0      1
c     3      4
d     6      7
多个列索引标签返回值类型: <class 'pandas.core.frame.DataFrame'>

整数切片:
    Ohio  Texas  California
a     0      1           2
c     3      4           5
标签切片:
    Ohio  Texas  California
a     0      1           2
c     3      4           5
获取数组中True对应的行:
    Ohio  Texas  California
c     3      4           5
d     6      7           8

3.2 .loc[] 和.iloc[] 存取器

  • .loc[]使用标签下标, .iloc[]使用整数下标, .ix[]可以混用
  • 下标对象是一个元组,有两个对象与行,列两个轴对应,若只有一个对象则对应[行,:]
    注:[:,列]是不可行的
import numpy as np
import pandas as pd
# TODO:.loc[]和.iloc[]存取器

# .loc[]使用标签下标
array = np.arange(16).reshape((4, 4))
X = pd.DataFrame(array, index=['a', 'c', 'd', 'e'], columns=['A', 'B', 'C', 'D'])
print(X)

# loc[]使用索引标签下标
print("输出B.loc['a':'c']:\n",X.loc['a':'c'])
print("输出B.loc['a':'c','B':'C']:\n",X.loc['a':'c','B':'C'])

#bool
print(X.loc['a':'d',['B','D']])
print(X.loc[X.C>3,['B','D']])

# .iloc[] 使用整数下标
print("B.iloc[1:]:\n",X.iloc[1:])

运行结果
    A   B   C   D
a   0   1   2   3
c   4   5   6   7
d   8   9  10  11
e  12  13  14  15

输出B.loc['a':'c']:
   A  B  C  D
a  0  1  2  3
c  4  5  6  7
输出B.loc['a':'c','B':'C']:
   B  C
a  1  2
c  5  6

   B   D
a  1   3
c  5   7
d  9  11
    B   D
c   5   7
d   9  11
e  13  15

B.iloc[1:]:
    A   B   C   D
c   4   5   6   7
d   8   9  10  11
e  12  13  14  15

3.3 获取单个值

.at[]和.iat[]分别使用标签和整数下标获取单个值,此外 get_value()与.at[]类似,不过其执行速度较快。

import numpy as np
import pandas as pd

# TODO:获取单个值
# .at[]和.iat[]分别使用标签和整数下标获取单个值,此外get_value()与.at[]类似,不过其执行速度要快一些:
#  创建数组
array = np.arange(16).reshape((4, 4))
X = pd.DataFrame(array, index=['a', 'c', 'd', 'e'], columns=['A', 'B', 'C', 'D'])
print(X)
print("X.at['c','B']即c行B列:",X.at['c','B'])
print("X.iat[1,1]即1行1列:",X.iat[1,1])

运行结果
    A   B   C   D
a   0   1   2   3
c   4   5   6   7
d   8   9  10  11
e  12  13  14  15
X.at['c','B']即c行B列: 5
X.iat[1,1]11: 5

3.4 query() 方法

当需要根据一定的条件对行进行过滤吋,通常可以先创建一个布尔数组,使用该数组获取 True 对应的行。可以使用先前的[ ]运算符使用~、&、|等位运算,也可以采用query()使用 not and or等关键字。

# TODO:Query()方法
import numpy as np
import pandas as pd

#  创建数组
array = np.arange(16).reshape((4, 4))
X = pd.DataFrame(array, index=['a', 'c', 'd', 'e'], columns=['A', 'B', 'C', 'D'])

print("X[(X.B>1)&(X.D<15)]:\n", X[(X.B>1)&(X.D<15)])
print("X.query('B>1 and D<15')",X.query("B>1 and D<15"))

运行结果
X[(X.B>1)&(X.D<15)]:
   A  B   C   D
c  4  5   6   7
d  8  9  10  11

X.query('B>1 and D<15')
   A  B   C   D
c  4  5   6   7
d  8  9  10  11

4. 文件输入输出

read_csv()从文本文件读入数据,它的可选参数非常多,下面只简要介绍一些常用参数:

  • sep参数指定数据的分隔符号,可以使用正则表达式,默认值为逗号。有时csv文件为了便于阅读,在逗号之后添加了一些空格以对齐每列的数据。如果希望忽略这些空格,可以将skipinitialspace参数设置为True。
  • 若数据使用空格或制表符分隔,可以不设置 sep参数,而将delim_whitespace参数设置为Tnue。
  • 默认情况下第一行文本被作为列索引标签,如果数据文件中没有保存列名的行,可以设置header参数为0。
  • 如果数据文件之前包含一些说明行,可以使用skiprows参数指定数据开始的行号。na_values、true_values 和l false_values等参数分别指定NaN、True和l False对应的字符串列表。
  • 如果希望从字符串读入数据,可以使用io.BytesIO(string)将字符串包装成输入流。
  • 如果希望将字符串转换为时间,可以使用parse_dates指定转换为时间的列。
  • 如果数据中包含中文,可以使用encoding参数指定文件的编码,例如"utf-8"、"gbk"等。指定编码之后得到的字符串列为Unicode字符串。
  • 可以使用usecols参数指定需要读入的列。
  • 当文件很大时,可以用chunksize参数指定一次读入的行数。当使用chunksize时, read_csv()返回一个迭代器。
  • 当文件名包含中文时,需要使用Unicode字符串指定文件名。
import pandas as pd
# TODO:文件的输入输出
# 使用chunksize迭代读取

list = []
table_reader = pd.read_csv('data.csv',encoding='utf-8',chunksize=10)
print(type(table_reader))
for tb in table_reader:
    list.append(tb)
print(list[0])

#正常读取返回一个DataFrame对象
table = pd.read_csv('data.csv',encoding='utf-8')
print(type(table))
print(table.loc[1])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值