pandas笔记
1. Pandas的基本数据结构和使用
Series的创建
>>>import numpy as np
>>>import pandas as pd
>>>s=pd.Series([1,2,3,np.nan,44,1]) # np.nan创建一个缺失数值
>>>s # 若未指定,Series会自动建立index,此处自动建立索引0-5
0 1.0
1 2.0
2 3.0
3 NaN
4 44.0
5 1.0
dtype: float64
DataFrame的创建
>>>dates=pd.date_range('20170101',periods=6)
>>>dates
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05', '2017-01-06'],
dtype='datetime64[ns]', freq='D')
>>>df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
>>>df
a b c d
2017-01-01 -1.993447 1.272175 -1.578337 -1.972526
2017-01-02 0.092701 -0.503654 -0.540655 -0.126386
2017-01-03 0.191769 -0.578872 -1.693449 0.457891
2017-01-04 2.121120 0.521884 -0.419368 -1.916585
2017-01-05 1.642063 0.222134 0.108531 -1.858906
2017-01-06 0.636639 0.487491 0.617841 -1.597920
DataFrame可以跟Numpy一样根据索引取出其中的数据,只是DataFrame索引方式更加多样化。DataFrame不仅可以根据默认的行列编号来索引,还可以根据标签序列来索引。
还可以采用字典的方式创建DataFrame:
>>>df2=pd.DataFrame({'a':1,'b':'hello kitty','c':np.arange(2),'d':['o','k']})
>>>df2
a b c d
0 1 hello kitty 0 o
1 1 hello kitty 1 k
对于DataFrame的一些属性也可以采用相应的方法查看
dtype # 查看数据类型
index # 查看行序列或者索引
columns # 查看各列的标签
values # 查看数据框内的数据,也即不含表头索引的数据
describe # 查看数据的一些信息,如每一列的极值,均值,中位数之类的,只能对数值型数据统计信息
transpose # 转置,也可用T来操作
sort_index # 排序,可按行或列index排序输出
sort_values # 按数据值来排序
一些例子
>>>df2.dtypes
a int64
b object
c int64
d object
dtype: object
>>>df2.index
RangeIndex(start=0, stop=2, step=1)
>>>df2.columns
Index(['a', 'b', 'c', 'd'], dtype='object')
>>>df2.values
array([[1, 'hello kitty', 0, 'o'],
[1, 'hello kitty', 1, 'k']], dtype=object)
>>>df2.describe # 只能对数值型数据统计信息
a c
count 2.0 2.000000
mean 1.0 0.500000
std 0.0 0.707107
min 1.0 0.000000
25% 1.0 0.250000
50% 1.0 0.500000
75% 1.0 0.750000
max 1.0 1.000000
>>>df2.T
0 1
a 1 1
b hello kitty hello kitty
c 0 1
d o k
>>>df2.sort_index(axis=1,ascending=False) # axis=1 按列标签从大到小排列
d c b a
0 o 0 hello kitty 1
1 k 1 hello kitty 1
>>>df2.sort_index(axis=0,ascending=False) # 按行标签从大到小排序
a b c d
1 1 hello kitty 1 k
0 1 hello kitty 0 o
>>>df2.sort_values(by="c",ascending=False) # 按c列的值从大到小排序
a b c d
1 1 hello kitty 1 k
0 1 hello kitty 0 o
2. 从DataFrame中筛选取出目的数据
从DataFrame中取出目的数据方法有多种,一般常用的有:
-
-
直接根据索引选取
-
-
-
根据标签选取(纵向选择列):loc
-
-
-
根据序列(横向选择行): iloc
-
-
-
组合使用标签序列来选取特定位置的数据: ix
-
-
-
通过逻辑判断筛选
-
简单选取
>>>import numpy as np
>>>import pandas as pd
>>>dates=pd.date_range('20170101',periods=6)
>>>df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['a','b','c','d'])
>>>df
a b c d
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
>>>df['a'] # 根据表签直接选取a列,也可用df.a,结果相同
2017-01-01 0
2017-01-02 4
2017-01-03 8
2017-01-04 12
2017-01-05 16
2017-01-06 20
Freq: D, Name: a, dtype: int64
>>>df[0:3] # 选择前3行,也可用行标签 df['2017-01-01':'2017-01-03'],结果相同,但是无法用此法选择多列
a b c d
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 10 11
loc使用显式的行标签来选取数据
DataFrame行的表示方式有两种,一种是通过显式的行标签来索引,另一种是通过默认隐式的行号来索引。loc方法是通过行标签来索引选取目标行,可以配合列标签来选取特定位置的数据。
>>>df.loc['2017-01-01':'2017-01-03']
a b c d
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 10 11
>>>df.loc['2017-01-01',['a','b']] # 选取特定行的a,b列
a 0
b 1
Name: 2017-01-01 00:00:00, dtype: int64
iloc使用隐式的行序列号来选取数据
使用iloc可以搭配列序列号来更简单的选取特定位点的数据
>>>df.iloc[3,1]
13
>>>df.iloc[1:3,2:4]
c d
2017-01-02 6 7
2017-01-03 10 11
ix利用ix可以混用显式标签与隐式序列号
loc只能使用显式标签来选取数据,而iloc只能使用隐式序列号来选取数据,ix则能将二者结合起来使用。
>>> df.ix[3:5,['a','b']]
a b
2017-01-04 12 13
2017-01-05 16 17
使用逻辑判断来选取数据
>>>df
a b c d
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
>>>df[df['a']>5] # 等价于df[df.a>5]
a b c d
2017-01-03 8 9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
3. Pandas设置特定位置值
>>>import numpy as np
>>>import pandas as pd
>>>dates=pd.date_range('20170101',periods=6)
>>>datas=np.arange(24).reshape((6,4))
>>>columns=['a','b','c','d']
>>>df=pd.DataFra me(data=datas,index=dates,colums=columns)
>>>df.iloc[2,2:4]=111 # 将第2行2,3列位置的数据改为111
a b c d
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 111 111
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
>>>df.b[df['a']>10]=0 # 等价于df.b[df.a>10] # 以a列大于10的数的位置为参考,改变b列相应行的数值为0
a b c d
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 111 111
2017-01-04 12 0 14 15
2017-01-05 16 0 18 19
2017-01-06 20 0 22 23
>>>df['f']=np.nan # 新建f列并设置数值为np.nan
a b c d f
2017-01-01 0 1 2 3 NaN