目录
创建序列和数组
import pandas as pd
import numpy as np
s = pd.Series([1, 3, 5, np.NAN, 8, 4]) #创建序列
s
Out[6]:
0 1.0
1 3.0
2 5.0
3 NaN
4 8.0
5 4.0
dtype: float64
dates = pd.date_range('20160301',periods=6) # 创建日期序列,periods为日期个数
dates
Out[8]:
DatetimeIndex(['2016-03-01', '2016-03-02', '2016-03-03', '2016-03-04',
'2016-03-05', '2016-03-06'],
dtype='datetime64[ns]', freq='D')
#创建一个6行4列,以dates为行标,以ABCD为列标的二维数组,注意np.random.randn为创建二维数组
data = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
data
Out[5]:
A B C D
2016-03-01 -0.776398 -0.113742 -0.482815 -2.377686
2016-03-02 -0.232630 0.929686 -0.029953 0.830375
2016-03-03 -0.858234 1.130634 1.450110 -1.312117
2016-03-04 -0.878027 -0.219138 -0.459148 0.428571
2016-03-05 0.021880 -1.655298 -1.618421 0.541966
2016-03-06 -0.903818 0.702461 1.966906 -0.348830
#以字典的方式创建二维数组
d={'A':1,'B':pd.Timestamp('20130301'),'C':range(4),'D':np.arange(4)}
d
Out[7]:
{'A': 1,
'B': Timestamp('2013-03-01 00:00:00'),
'C': range(0, 4),
'D': array([0, 1, 2, 3])}
#利用d生成二维数组
df = pd.DataFrame(d)
df
Out[9]:
A B C D
0 1 2013-03-01 0 0
1 1 2013-03-01 1 1
2 1 2013-03-01 2 2
3 1 2013-03-01 3 3
查看数据
#查看列
df.A
Out[10]:
0 1
1 1
2 1
3 1
Name: A, dtype: int64
#高效率的数据索引loc,只认标签名如:20160305
df.loc[A]
data.loc['20160302':'20160305',['B','C']]
#data.iloc可以选择索引代号
data,iloc[:,1:3]#选择所有行的1-3列
#查看A的数据类型,A为一个序列
type(df.A)
Out[11]: pandas.core.series.Series
data.head(2)#查看前几行,默认前5行
Out[14]:
A B C D
2016-03-01 -0.776398 -0.113742 -0.482815 -2.377686
2016-03-02 -0.232630 0.929686 -0.029953 0.830375
data.tail()#查看后几行,默认5行
Out[15]:
A B C D
2016-03-02 -0.232630 0.929686 -0.029953 0.830375
2016-03-03 -0.858234 1.130634 1.450110 -1.312117
2016-03-04 -0.878027 -0.219138 -0.459148 0.428571
2016-03-05 0.021880 -1.655298 -1.618421 0.541966
2016-03-06 -0.903818 0.702461 1.966906 -0.348830
data.index#查看行标
data.columns#查看列标
data.values#查看值
data.describe()#查看数据的统计数据
Out[16]:
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean -0.604538 0.129100 0.137780 -0.372954 #均值
std 0.397235 1.033157 1.335795 1.251326 #方差
min -0.903818 -1.655298 -1.618421 -2.377686
25% -0.873078 -0.192789 -0.476898 -1.071295
50% -0.817316 0.294360 -0.244551 0.039870
75% -0.368572 0.872880 1.080094 0.513617
max 0.021880 1.130634 1.966906 0.830375
数据排序
data.sort_index(axis=1,ascending=False)#根据列标签降序,1为列,2为行
Out[18]:
D C B A
2016-03-01 -2.377686 -0.482815 -0.113742 -0.776398
2016-03-02 0.830375 -0.029953 0.929686 -0.232630
2016-03-03 -1.312117 1.450110 1.130634 -0.858234
2016-03-04 0.428571 -0.459148 -0.219138 -0.878027
2016-03-05 0.541966 -1.618421 -1.655298 0.021880
2016-03-06 -0.348830 1.966906 0.702461 -0.903818
data.sort_values(by='A')#根据A列的数据排序
Out[19]:
A B C D
2016-03-06 -0.903818 0.702461 1.966906 -0.348830
2016-03-04 -0.878027 -0.219138 -0.459148 0.428571
2016-03-03 -0.858234 1.130634 1.450110 -1.312117
2016-03-01 -0.776398 -0.113742 -0.482815 -2.377686
2016-03-02 -0.232630 0.929686 -0.029953 0.830375
2016-03-05 0.021880 -1.655298 -1.618421 0.541966
#可以使用布尔运算
data[data.A>0]
Out[20]:
A B C D
2016-03-05 0.02188 -1.655298 -1.618421 0.541966
数据修改
#修改元素
data.iat[0,0] = 100
A B C D
2016-03-01 100.000000 -0.113742 -0.482815 -2.377686
2016-03-02 -0.232630 0.929686 -0.029953 0.830375
2016-03-03 -0.858234 1.130634 1.450110 -1.312117
2016-03-04 -0.878027 -0.219138 -0.459148 0.428571
2016-03-05 0.021880 -1.655298 -1.618421 0.541966
2016-03-06 -0.903818 0.702461 1.966906 -0.348830
data.A = range(6)
A B C D
2016-03-01 0 -0.113742 -0.482815 -2.377686
2016-03-02 1 0.929686 -0.029953 0.830375
2016-03-03 2 1.130634 1.450110 -1.312117
2016-03-04 3 -0.219138 -0.459148 0.428571
2016-03-05 4 -1.655298 -1.618421 0.541966
2016-03-06 5 0.702461 1.966906 -0.348830
data.iloc[:,2:5] = 1000
#用于查看的方法基本都可以用于修改
#添加新的行与列
dates = pd.date_range('20160301', periods=6)
data = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
data:
A B C D
2016-03-01 -0.433188 0.055299 0.719234 -0.669594
2016-03-02 -0.408811 1.321846 -0.498564 -0.039656
2016-03-03 -1.064202 0.810191 -0.160165 0.921816
2016-03-04 -0.339701 0.104324 -0.989710 0.843287
2016-03-05 -2.667729 1.336503 0.211461 -0.396538
2016-03-06 -0.437394 -1.000561 0.113986 -0.335567
#添加
df1=data.reindex(index=dates[0:4],columns=list(data.columns)+['E'])
#默认添加后的值为NaN
df1:
A B C D E
2016-03-01 -0.433188 0.055299 0.719234 -0.669594 NaN
2016-03-02 -0.408811 1.321846 -0.498564 -0.039656 NaN
2016-03-03 -1.064202 0.810191 -0.160165 0.921816 NaN
2016-03-04 -0.339701 0.104324 -0.989710 0.843287 NaN
#对NaN的处理可以用上面修改数据的方法,还可以用
df1.dropna() # 去掉na的行
df1.fillna(value=5)/df1.fillna(5)#填充
A B C D E
2016-03-01 -0.433188 0.055299 0.719234 -0.669594 5.0
2016-03-02 -0.408811 1.321846 -0.498564 -0.039656 5.0
2016-03-03 -1.064202 0.810191 -0.160165 0.921816 5.0
2016-03-04 -0.339701 0.104324 -0.989710 0.843287 5.0
pd.isnull(df1).any().any()#返回是否存在空数据
数据合并
#数据合并
dates = pd.date_range('20160301', periods=6)
data = pd.DataFrame(np.random.randn(10, 4),columns=list('ABCD'))
A B C D
0 -1.434443 -0.352534 -0.846994 1.586152
1 -0.918723 -1.843476 0.456694 1.256904
2 -1.658280 0.508838 1.474068 0.180334
3 -1.304920 -0.751033 0.919447 1.212845
4 0.224827 0.208548 0.797374 -0.730663
5 0.050870 0.396789 -1.743149 0.223697
6 -1.820222 -0.839744 0.980039 -0.203871
7 -0.555854 1.026396 -0.601722 1.234643
8 -0.160671 0.117587 0.975355 -0.647912
9 2.133687 -1.632052 -0.223723 -1.669436
#用iloc来取行,结果与data一样
df1=pd.concat([data.iloc[:3],data.iloc[3:7],data.iloc[7:]])
(data==df1).all().all() #所有元素是不是都是一样的
2.用merge函数
数据分组
创建一个数组
先求 和,A里面只有BAR和FOO
多维索引列表的创建
将列索引转化为行索引
数据透视
只看一部分数据
查看元数据中A,B两列为行索引指标,以C为列索引数据,NAN为原数据中不存在的
时间序列
pandas里面时间运算非常简便
以秒为单位创建数据
数据采样,每两分钟求和
计算时间间隔
计算几天后日期
category数据
数据写入磁盘文件
指定第0列为索引列