Pandas学习笔记
References:
Pandas中的数据对象
# coding=utf-8
import panda as pd
import numpy as np
pd.__version__
'0.20.3'
Series对象
Pandas最基本的对象,由两个数组组成:
- index:标签信息,若创建时不指定index,会自动创建。
- values: 保存元素值的ndarray数组
#help(pd.Series)
s = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])
print(s.index)
print(s.values)
s.name='abc'
print(s.name)
#created without index
a = pd.Series([1,2,3,4])
print(a.index)
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
[1 2 3 4 5]
abc
RangeIndex(start=0, stop=4, step=1)
访问:同时支持位置和标签形式
print(s)
print('s[0]:', s[0])
print('s[b]:', s['b'])
s[0] += 1
print('s[0]:', s[0])
a 1
b 2
c 3
d 4
e 5
Name: abc, dtype: int64
s[0]: 1
s[b]: 2
s[0]: 2
切片:支持位置切片和标签切片。
位置切片:包括起始位置,不包括结束位置;
标签切片:同时包括起始标签和结束标签。
print(s)
print(s[1:3])
print(s['b':'d'])
s[1:3] *= 2
print(s[1:3])
a 2
b 2
c 3
d 4
e 5
Name: abc, dtype: int64
b 2
c 3
Name: abc, dtype: int64
b 2
c 3
d 4
Name: abc, dtype: int64
b 4
c 6
Name: abc, dtype: int64
操作符运算:会对标签相同的两个元素进行计算,一方标签不存在时,会以nan填充(float64)。
a = pd.Series([1,2,3,4], index=['a','b','c','d'])
b = pd.Series([2,3,4,5], index=['b','c','d','e'])
c = a+b
c
a NaN
b 4.0
c 6.0
d 8.0
e NaN
dtype: float64
在pandas中用函数 isnull 和 notnull 来检测数据丢失:
print(pd.isnull(c))
print(pd.isnull(c[0]))
print(pd.notnull(c))
a True
b False
c False
d False
e True
dtype: bool
True
a False
b True
c True
d True
e False
dtype: bool
DataFrame 对象
一个Datarame表示一个表格,类似电子表格的数据结构,包含一个经过排序的列表集,它们没一个都可以有不同的类型值(数字,字符串,布尔等等)。Datarame有行和列的索引;它可以被看作是一个Series的字典(每个Series共享一个索引)。与其它你以前使用过的(如 R 的 data.frame )类似Datarame的结构相比,在DataFrame里的面向行和面向列的操作大致是对称的。在底层,数据是作为一个或多个二维数组存储的,而不是列表,字典,或其它一维的数组集合。
用DataFrame()函数将内存中的数据转换为DataFrame 对象
DataFrame()有三个参数:data,index,columns,data可以是字典或者二维数组
1.用字典创建DataFrame 对象:
这是定义一个 DataFrame 对象的常用方法——使用 dict 定义。字典的“键”("name","marks","price")就是 DataFrame 的 columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据。上面的定义中没有确定索引,所以,按照惯例就是从 0 开始的整数。
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)
frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
DataFrame 对象拥有行索引(可以有多级索引)index和列索引columns
print(frame.index)
print(frame.columns)
print(frame.index[0])
print(frame.columns[2])
RangeIndex(start=0, stop=5, step=1)
Index(['pop', 'state', 'year'], dtype='object')
0
year
给一个不存在的列赋值,将会创建一个新的列。 像字典一样 del 关键字将会删除列:
frame['day'] = 1
print(frame)
del frame['day']
print(frame)
pop state year day
0 1.5 Ohio 2000 1
1 1.7 Ohio 2001 1
2 3.6 Ohio 2002 1
3 2.4 Nevada 2001 1
4 2.9 Nevada 2002 1
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
2.用ndarray创建DataFrame 对象:
frame2 = pd.DataFrame(np.random.randint(0, 10, (4, 2)), index=['A','B','C','D'], columns=['a','b'])
frame2
a | b | |
---|---|---|
A | 0 | 7 |
B | 2 | 3 |
C | 6 | 6 |
D | 4 | 8 |
Index 对象
Index 对象保存索引标签数据,可以当作一维数组,但它是只读的。
可以通过values属性获得保存标签的数组
index = frame.columns
print(index)
print(index.values)
Index(['pop', 'state', 'year'], dtype='object')
['pop' 'state' 'year']
Index 对象也有字典的映射功能,将值映射到键的位置:
print(index.get_loc('state'))
print(index.get_indexer(['state', 'year']))
1
[1 2]
Multindex 对象
pass
下标存取
[ ]操作符
A = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],\
columns=['Ohio', 'Texas', 'California'])
print(A)
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
- 单个索引标签: 获取对应的列,返回一个Series对象:name是列索引名,index是行索引,values是数值。
在此基础上,使用两个[col][row]
时可返回对应位置的元素
行索引可以用标签也可以用整数索引,列索引只能用标签索引
print(A['Ohio'])
print(A['Ohio'].index)
print(A['Ohio'].values)
print(A['Ohio'].name)
print(A['Ohio']['c'])
print(A['Ohio'][2])
#error:print(A[0][2])
a 0
c 3
d 6
Name: Ohio, dtype: int64
Index(['a', 'c', 'd'], dtype='object')
[0 3 6]
Ohio
3
6
- 多个索引标签: 获取以列表、数组表示的多个标签对应的列,返回一个DataFrame 对象。
print(A[['Ohio', 'Texas']])
Ohio Texas
a 0 1
c 3 4
d 6 7
- 整数切片:以整数下标获取切片对应的行,不包含终值的行。
print(A[0:2])
Ohio Texas California
a 0 1 2
c 3 4 5
- 标签切片:当使用标签作为切片时包含终值。
print(A['a':'c'])
Ohio Texas California
a 0 1 2
c 3 4 5
- 布尔数组:获取数组中 True 对应的行。
print(A[A.Ohio>0])
Ohio Texas California
c 3 4 5
d 6 7 8
- 布尔DataFrame: 将 DataFhime对象中 False 对应的元素设置为 NaN 。
print(A[A>2])
Ohio Texas California
a NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
loc[ ]和.iloc[ ]存取器
.loc[ ]
使用标签下标,.iloc[ ]
使用整数下标,.ix[]
可以混用。
下标对象是一个元组,有两个对象与行,列两个轴对应,若只有一个对象则对应[行,:],注:[:,列]是不可行的
每个轴的下标对象支持单个标签、多标签列表、标签切片以及布尔数组。
array=np.arange(16).reshape((4, 4))
B = pd.DataFrame(array, index=['a', 'c', 'd','e'],\
columns=['A', 'B', 'C', 'D'])
print(B)
print(B.loc['a':'d'])
# print(array[:,1])
# error:print(B.loc[:,'B'])
print(B.loc['a':'d','B':'C'])
print(B.loc['a':'d',['B','D']])
# bool
print(B.loc['a':'d',['B','D']])
print(B.loc[B.C>3,['B','D']])
A B C D
a 0 1 2 3
c 4 5 6 7
d 8 9 10 11
e 12 13 14 15
A B C D
a 0 1 2 3
c 4 5 6 7
d 8 9 10 11
B C
a 1 2
c 5 6
d 9 10
B D
a 1 3
c 5 7
d 9 11
B D
a 1 3
c 5 7
d 9 11
B D
c 5 7
d 9 11
e 13 15
获取单个值
.at[]和.iat[]分别使用标签和整数下标获取单个值,此外 get_value()与.at[]类似,不过其执行速度要快一些:
print(B.at['c', 'B'])
print(B.iat[1, 1])
print(B.get_value('c', 'B'))
5
5
5
query()方法
当需要根据一定的条件对行进行过滤吋,通常可以先创建一个布尔数组,使用该数组获取 True 对应的行:
可以使用先前的[ ]运算符使用~、&、|等位运算符,也可以采用query()使用 not and or等关键字。
print(B[(B.B > 1) & (B.D < 15)])
print(B.query("B > 1 and D < 15"))
A B C D
c 4 5 6 7
d 8 9 10 11
A B C D
c 4 5 6 7
d 8 9 10 11
文件的输入输出
读取CSV
# 使用chunksize迭代读取
list = []
table_reader = pd.read_csv('A.csv',encoding='utf-8',chunksize=10)
print(type(table_reader))
for tb in table_reader:
list.append(tb)
print(list[0])
<class 'pandas.io.parsers.TextFileReader'>
姓名 地区 性别 年龄 身高cm 婚姻状况 文化程度 单位类型 住房情况 收入(元) \
0 林小姐 ID 15893 晋安区 女 32 164 未婚 本科 私营企业 其他 3001-5000
1 吴女士 ID 15883 福州 女 33 166 离婚 大专 事业单位 已购房 20001-50000
2 吴小姐 ID 15842 鼓楼区 女 28 155 未婚 大专 事业单位 已购房 2001-3000
3 欧先生 ID 15777 江西 男 35 171 离婚 本科 外企企业 已购房 10001-20000
4 陈小姐 ID 15117 仓山区 女 30 163 未婚 本科 事业单位 与父母同住 5001-8000
5 郑女士 ID 15115 鼓楼区 女 34 161 离婚 硕士 私营企业 与父母同住 5000
6 媛女士 ID 15114 鼓楼区 女 32 165 离婚 本科 事业单位 与父母同住 5000
7 潘先生 ID 15113 仓山区 男 35 172 离婚 大专 私营企业 已购房 8000
8 林小姐 ID 15075 仓山区 女 30 165 未婚 本科 事业单位 已购房 10000
9 黄先生 ID 15068 鼓楼区 男 28 172 未婚 本科 国有企业 多套房 7000
年龄差下限 年龄差上限 地区.1 身高下限 身高上限 文化程度.1 住房情况.1 婚姻状况.1 收入
0 0.0 5.0 本市区 170.0 180.0 大专 已购房 未婚 5000.0
1 0.0 10.0 本市区 170.0 180.0 大专 已购房 离婚 8000.0
2 0.0 5.0 本市区 168.0 170.0 大专 已购房 未婚 5000.0
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 0.0 5.0 本市区 170.0 180.0 大专 已购房 未婚 5000.0
5 0.0 5.0 本市区 170.0 180.0 本科 已购房 离婚 5000.0
6 0.0 5.0 本市区 170.0 180.0 大专 已购房 未婚 5000.0
7 0.0 10.0 本市区 158.0 165.0 中专 不限 离婚 3000.0
8 0.0 5.0 本市区 173.0 185.0 大专 已购房 未婚 10000.0
9 0.0 5.0 本市区 160.0 165.0 大专 已购房 未婚 3000.0
# 正常读取返回一个DataFrame对象
table = pd.read_csv('A.csv',encoding='utf-8')
print(type(table))
print(table.loc[1])
<class 'pandas.core.frame.DataFrame'>
姓名 吴女士 ID 15883
地区 福州
性别 女
年龄 33
身高cm 166
婚姻状况 离婚
文化程度 大专
单位类型 事业单位
住房情况 已购房
收入(元) 20001-50000
年龄差下限 0
年龄差上限 10
地区.1 本市区
身高下限 170
身高上限 180
文化程度.1 大专
住房情况.1 已购房
婚姻状况.1 离婚
收入 8000
Name: 1, dtype: object