准备工作
创建一个6X4的DataFrame,行索引为时间序列,列索引为字母
dates = pd.date_range('20180205',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),
index=dates,columns=['A','B','C','D'])
outputs:
A B C D
2018-02-05 0 1 2 3
2018-02-06 4 5 6 7
2018-02-07 8 9 10 11
2018-02-08 12 13 14 15
2018-02-09 16 17 18 19
2018-02-10 20 21 22 23
数据的选取
按行列选取元素
以下两种方式可选取带索引的单列元素
df[A]
df.A #返回列标为A的元素 (Series形式)
output:
2018-02-05 0
2018-02-06 4
2018-02-07 8
2018-02-08 12
2018-02-09 16
2018-02-10 20
Freq: D, Name: A, dtype: int32
选择多行元素
df[0:3]
df[20180205:20180208] #返回前4行元素(DataFrame形式)
output:
A B C D
2018-02-05 0 1 2 3
2018-02-06 4 5 6 7
2018-02-07 8 9 10 11
loc
更加一般地,可以使用loc方法选取任意行列
df.loc['20180205'] #返回所在标签的行/列
output:
A 0
B 1
C 2
D 3
Name: 2018-02-05 00:00:00, dtype: int32
df.loc['20180205',['A','B']] #对列作限定
output:
A 0
B 1
Name: 2018-02-05 00:00:00, dtype: int32
iloc
iloc可按位置精确切割选取DataFrameoutputs
df.iloc[3:5,1:3] #选取3~5行,1~3列
output:
A B C D
2018-02-08 12 13 14 15
2018-02-09 16 17 18 19
参数1指定行,参数2指定列,缺省用:表示选取全部
跳选使用形如[1,3,5]的参数
基于比较的选择
可按设置条件选择数据
df[df.A<10] #选择列标A小于10的数据块
output:
A B C D
2018-02-05 0 1 2 3
2018-02-06 4 5 6 7
2018-02-07 8 9 10 11
数据的修改
在选定数据后,可以通过简单的赋值来修改所选中部分的值
df.A = 0 #将A列的所有元素都修改为0
可以添加新的列
df.E = 0 #追加全0列E
若是已经确定的Series则需保证长度对齐
缺失值的处理
初始数据为非数或缺失的部分,在转化为DataFrame时用NaN(Not a Number)表示,对于NaN类型的数据,在分析时常常要对其进行处理,Pandas提供了相应的处理方式
pd.fillna()
使用指定参数代替非数值
df.fillna(value=0) #value指定值替换所有NaN
pd.dropna()
删去带有缺失值的数据项
df.dropna(axis=0,how='any')
可选参数:
- axis =0:仅对行 =1:仅对列
- how =’any’ 默认 =’all’ 仅全空
pd.isnull()
返回一个同尺寸的DataFrame,元素为True/False,用来检测非数位置