(六)DataFrame的操作

注意:内部操作(包括plot)不用写pd,格式为x.函数名(参数)

DataFrame的基本性质

import pandas as pd
HS300=pd.read_excel('沪深300指数(2018年).xlsx',header=0,index_col=0)
HS300.describe()
Out[4]: 
              开盘点位         最高点位         最低点位         收盘点位
count   243.000000   243.000000   243.000000   243.000000
mean   3605.910629  3633.511737  3576.081525  3605.809573
std     379.357328   378.562382   380.805563   380.883948
min    2994.795000  3024.352500  2964.875000  2990.505700
25%    3259.739050  3281.134050  3227.896000  3265.065300
50%    3521.587600  3541.782000  3478.213400  3517.656800
75%    3897.636750  3921.321600  3875.582550  3898.566550
max    4389.454700  4403.337500  4351.487100  4389.885300
HS300.index#索引名,注意是没有括号的
Out[8]: 
DatetimeIndex(['2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05',
               '2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11',
               '2018-01-12', '2018-01-15',
               ...
               '2018-12-17', '2018-12-18', '2018-12-19', '2018-12-20',
               '2018-12-21', '2018-12-24', '2018-12-25', '2018-12-26',
               '2018-12-27', '2018-12-28'],
              dtype='datetime64[ns]', name='日期', length=243, freq=None)
HS300.columns#列名,也没有括号
Out[10]: Index(['开盘点位', '最高点位', '最低点位', '收盘点位'], dtype='object')
HS300['收盘点位'].unique()#此列的值的种类
HS300['收盘点位'].value_counts()#每一种值出现的次数汇总

DataFrame的索引与切片

HS300.loc[['2018-12-18'],['开盘点位']]#根据行、列索引名称找出对应数据
Out[5]: 
    		 开盘点位
日期
2018-12-18   3139.9493
Name: 2018-12-18 00:00:00, dtype: float64
HS300.iloc[7:13,1:3]#根据具体第几行(和第几列)找出数据
Out[12]: 
                 最高点位       最低点位
日期                              
2018-01-11  4211.7990  4181.9572
2018-01-12  4227.3923  4199.0251
2018-01-15  4262.9314  4216.3585
2018-01-16  4260.2118  4213.1275
2018-01-17  4283.3449  4230.5367
2018-01-18  4292.6372  4246.6840
HS300[(HS300['开盘点位']>=4100)&(HS300.收盘点位<=4200)]
#不同的筛选条件要用圆括号括起来,并用&相连。有两种表示方法
Out[15]: 
                 开盘点位       最高点位       最低点位       收盘点位
日期                                                    
2018-01-04  4114.1213  4137.6420  4105.8858  4128.8119
2018-01-05  4133.3439  4151.2818  4123.2817  4138.7505
2018-01-08  4140.8545  4166.3182  4127.3081  4160.1595
2018-01-09  4157.5394  4191.2843  4153.5021  4189.2977
2018-02-06  4182.3257  4211.5234  4131.5562  4148.8856
2018-02-07  4205.7365  4212.5677  4048.4228  4050.4972
2018-02-27  4120.8712  4120.8712  4051.8054  4058.9806
2018-03-12  4130.7082  4139.5259  4112.7658  4127.6662
2018-03-13  4124.3312  4130.2829  4087.5629  4091.2533

DataFrame的排序

HS300.sort_index(ascending=True)#按照行索引的升序排列,axis=0
Out[18]: 
                 开盘点位       最高点位       最低点位       收盘点位
日期                                                    
2018-01-02  4045.2086  4087.7789  4045.2086  4087.4012
2018-01-03  4091.4607  4140.0543  4088.7302  4111.3925
2018-01-04  4114.1213  4137.6420  4105.8858  4128.8119
2018-01-05  4133.3439  4151.2818  4123.2817  4138.7505
HS300.sort_values(by="最高点位",ascending=False)
#按照“最高点位”列的数值大小降序排列
Out[19]: 
                 开盘点位       最高点位       最低点位       收盘点位
日期                                                    
2018-01-26  4352.2211  4403.3375  4351.4871  4381.2996
2018-01-24  4389.4547  4397.8196  4349.0865  4389.8853
2018-01-29  4387.0577  4395.9053  4287.1124  4302.0181
2018-01-25  4381.9768  4392.1963  4336.2386  4365.0794
2018-01-23  4346.8885  4383.5722  4346.7925  4382.6129

DataFrame的修改和删除

close=pd.read_csv('C:/Users/lenovo/Desktop/quantitative investment/close.csv',encoding='gb18030');close
Out[22]: 
   ticker secShortName  tradeDate  closePrice
0       1         平安银行  2017/6/20        9.12
1       2          万科A  2017/6/20       21.03
2       4         国农科技  2017/6/20         NaN
3       5         世纪星源  2017/6/20        5.45
4       6         深振业A  2017/6/20        8.87
5       7          全新好  2017/6/20       15.87
close2=close.rename(columns={'ticker':'序号'});close2#修改第二列列名,格式与字典相同
Out[24]: 
   序号 secShortName  tradeDate  closePrice
0   1         平安银行  2017/6/20        9.12
1   2          万科A  2017/6/20       21.03
2   4         国农科技  2017/6/20         NaN
3   5         世纪星源  2017/6/20        5.45
4   6         深振业A  2017/6/20        8.87
5   7          全新好  2017/6/20       15.87
a=close2.drop(['序号'],axis=1);a#删除“序号”列,删的是列,axis=1一定要写
#直接del close2['序号']也可达到同样效果
Out[25]: 
  secShortName  tradeDate  closePrice
0         平安银行  2017/6/20        9.12
1          万科A  2017/6/20       21.03
2         国农科技  2017/6/20         NaN
3         世纪星源  2017/6/20        5.45
4         深振业A  2017/6/20        8.87
5          全新好  2017/6/20       15.87
b=close2.drop(close2[close2.closePrice>10].index);b#删掉符合条件的行
Out[27]: 
   序号 secShortName  tradeDate  closePrice
0   1         平安银行  2017/6/20        9.12
2   4         国农科技  2017/6/20         NaN
3   5         世纪星源  2017/6/20        5.45
4   6         深振业A  2017/6/20        8.87

DataFrame的缺失值和重复值处理

注意:isnull()和duplicated()函数返回的是布尔值

close2[close2['closePrice'].isnull()]#找出closeprice列有缺失值的行
Out[27]: 
   序号 secShortName  tradeDate  closePrice
2   4         国农科技  2017/6/20         NaN
a=close2.dropna();a#删除有缺失值行
Out[28]: 
   序号 secShortName  tradeDate  closePrice
0   1         平安银行  2017/6/20        9.12
1   2          万科A  2017/6/20       21.03
3   5         世纪星源  2017/6/20        5.45
4   6         深振业A  2017/6/20        8.87
5   7          全新好  2017/6/20       15.87
b=close2.fillna(value=close2.closePrice.mean());b#用均值填充缺失值
Out[29]: 
   序号 secShortName  tradeDate  closePrice
0   1         平安银行  2017/6/20       9.120
1   2          万科A  2017/6/20      21.030
2   4         国农科技  2017/6/20      12.068
3   5         世纪星源  2017/6/20       5.450
4   6         深振业A  2017/6/20       8.870
5   7          全新好  2017/6/20      15.870
c=close2.fillna(method='ffill');c#用缺失值所在列的前一个非NaN值填充;反之method=bfill
Out[30]: 
   序号 secShortName  tradeDate  closePrice
0   1         平安银行  2017/6/20        9.12
1   2          万科A  2017/6/20       21.03
2   4         国农科技  2017/6/20       21.03
3   5         世纪星源  2017/6/20        5.45
4   6         深振业A  2017/6/20        8.87
5   7          全新好  2017/6/20       15.87
close2[close2.duplicated()]#找出重复行,本例无重复
Out[31]: 
Empty DataFrame
Columns: [序号, secShortName, tradeDate, closePrice]
Index: []
close2.drop_duplicates()#删除重复行(保留最先出现的)

DataFrame之间的操作

concat

1、pd.concat([数据框1,…,数据框n],axis=0或1),并集拼接,不考虑重复值;
2、若拼接时某行或者某列在其他数据框中没有,则此位置数据输出NaN

c=pd.concat([a,b],axis=0);c#按行拼接
Out[40]: 
   序号 secShortName  tradeDate  closePrice
0   1         平安银行  2017/6/20       9.120
1   2          万科A  2017/6/20      21.030
3   5         世纪星源  2017/6/20       5.450
4   6         深振业A  2017/6/20       8.870
5   7          全新好  2017/6/20      15.870
0   1         平安银行  2017/6/20       9.120
1   2          万科A  2017/6/20      21.030
2   4         国农科技  2017/6/20      12.068
3   5         世纪星源  2017/6/20       5.450
4   6         深振业A  2017/6/20       8.870
5   7          全新好  2017/6/20      15.870

merge

1、pd.merge(a,b,how,on,left_on=‘a’,right_on=‘A’,left_index=True,right_index=True,…);
2、how分别可选"left/right/inner/outer",即按照左/右边数据框连接、交集(默认)、并集。具体见下例;
3、on表示按照哪一列作为合并的键,此列在两个表中都有;
4、left_on=‘a’,right_on='A’表示可能两个表没有相同的列名,但a和A列其实是一个东西,比如‘stockid’和‘股票代码’;
5、left_index=True,right_index=True表示合并索引。

data1=pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc'))
data2=pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz'))
data1
Out[46]: 
   a  b  c
0  0  1  2
1  3  4  5
data2
Out[47]: 
    a   y   z
0  20  21  22
1  23  24  25
pd.merge(data1,data2,how='left')#以左数据框的数据为准
Out[48]: 
   a  b  c   y   z
0  0  1  2 NaN NaN
1  3  4  5 NaN NaN
pd.merge(data1,data2,how='right')
Out[49]: 
    a   b   c   y   z
0  20 NaN NaN  21  22
1  23 NaN NaN  24  25
pd.merge(data1,data2,how='inner')
Out[51]: 
Empty DataFrame
Columns: [a, b, c, y, z]
Index: []
pd.merge(data1,data2,how='outer')
Out[52]: 
    a    b    c     y     z
0   0  1.0  2.0   NaN   NaN
1   3  4.0  5.0   NaN   NaN
2  20  NaN  NaN  21.0  22.0
3  23  NaN  NaN  24.0  25.0
pd.merge(data1,data2,how='outer',left_index=True,right_index=True)
#合并了索引,因为两个数据框都有a列,因此重命名了
Out[59]: 
   a_x  b  c  a_y   y   z
0    0  1  2   20  21  22
1    3  4  5   23  24  25
data3=pd.DataFrame(np.arange(6).reshape(2,3),columns=['a1','y','z'])
pd.merge(data1,data3,left_on='a',right_on="a1")
Out[67]: 
   a  b  c  a1  y  z
0  0  1  2   0  1  2
1  3  4  5   3  4  5

join

1、a.join(b, on=None, how=’left默认’, lsuffix=”, rsuffix=”,…),注意没有pd;
2、参数与merge类似,lsuffix表示左数据框中重复列的后缀,rsuffix为右,有相同列时必填;
3、b的关键列是index,可使用set_index()改变,具体见下例。

a=pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A':['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
b=pd.DataFrame({'key':['K0', 'K1', 'K2','K3'], 'B':['B0', 'B1', 'B2', 'B3']})
a
Out[70]: 
  key   A
0  K0  A0
1  K1  A1
2  K2  A2
3  K3  A3
4  K4  A4
5  K5  A5
b
Out[71]: 
   key    B
0   K0   B0
1   K1   B1
2   K2   B2
3   K3   B3
a.join(b,lsuffix='_a', rsuffix='_b')#对相同的列加后缀区分
Out[75]: 
  key_a   A key_b    B
0    K0  A0    K0   B0
1    K1  A1    K1   B1
2    K2  A2    K2   B2
3    K3  A3    K3   B3
4    K4  A4   NaN  NaN
5    K5  A5   NaN  NaN
a.join(b.set_index('key'), on='key')
#先把指定的列key设置为b的索引,再用on,这点与merge不同。且默认how=left=a
Out[77]: 
  key   A    B
0  K0  A0   B0
1  K1  A1   B1
2  K2  A2   B2
3  K3  A3   B3
4  K4  A4  NaN
5  K5  A5  NaN
pd.merge(a,b,how="left",on='key')
Out[78]: 
  key   A    B
0  K0  A0   B0
1  K1  A1   B1
2  K2  A2   B2
3  K3  A3   B3
4  K4  A4  NaN
5  K5  A5  NaN
发布了31 篇原创文章 · 获赞 2 · 访问量 1617

猜你喜欢

转载自blog.csdn.net/hzk427/article/details/103872045
今日推荐