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

文件的输入输出

API-Input/Output

读取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
posted @ 2018-01-18 15:09  Messier  阅读(438)  评论(0编辑  收藏  举报