15、pandas模块:
K线、tick数据都是pandas.DataFrame类型,因此我们有必要介绍下pandas模块。
Pandas 的主要数据结构是 Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。Pandas 基于 NumPy 开发,可以与其它第三方科学计算支持库完美集成。
Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。
15.1、Series一维数据结构
Series包含行索引index(行标签)和数据两个部分,数据也可以有一个name属性,例如:
import pandas as pd
s=pd.Series([4266.0,4270.0,4270.0,4268.0],index=None,name='open')
print(s)
print('索引为2的数据:',s[2])
print('s的索引:',s.index)
print('s的数据名',s.name)
print('索引1-3的数据,间隔2行:')
print(s[1:3])
'''输出结果为:0 4266.01 4270.02 4270.03 4268.0Name: open, dtype: float64索引为2的数据: 4270.0s的索引: RangeIndex(start=0, stop=4, step=1)s的数据名 open索引1-3的数据,间隔2行:1 4270.02 4270.0Name: open, dtype: float64'''
我们用pd.Series类实例化了一个一维序列对象,数据由列表[4266.0,4270.0,4270.0,4268.0]生成,行索引index默认为None,则索引是从0开始的整数,我们为数据指定了一个名称'open'。Series可以通过索引获取单个数据,也可以像列表数据那样用切片获取多个数据,注意这里的索引类似于“键”,也称为行标签,是可哈希类型,不同于列表的索引为位置序号。
Series可按索引取值,也可按位置取值,例如:
>>> s
0 4266.0
1 4270.0
2 4270.0
3 4268.0
Name: open, dtype: float64
>>> s[2] #索引为2的数据
4270.0
>>> s.loc[2] #索引为2的数据
4270.0
>>> s.iloc[2] #位置序号为2的数据
4270.0
>>> s.iloc[-2] #位置序号为-2的数据
4270.0
>>>
Series结构转换为DataFrame结构,例如:
>>> s
0 4266.0
1 4270.0
2 4270.0
3 4268.0
Name: open, dtype: float64
>>> d=s.to_frame() #行索引的name属性自动变成了列标签
>>> d
open
0 4266.0
1 4270.0
2 4270.0
3 4268.0
>>>
15.2、DataFrame二维数据结构
DataFrame包含index(行标签,又称行索引)和columns(列标签,又称列索引)及数据,行和列的标签也可以指定names属性,例如:
>>> import pandas as pd
>>> k1=[4266.0,4272.0,4265.0,4270.0]
>>> k2=[4270.0,4273.0,4270.0,4270.0]
>>> k3=[4270.0,4271.0,4267.0,4268.0]
>>> df=pd.DataFrame([k1,k2,k3],index=None,columns=['open','high','low','close'])
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>>
我们用三个列表k1、k2、k3创建一个3行4列的DataFrame数据,未指定行索引index,index值默认是从0开始的整数,指定了行标签columns,标签数量和列表元素个数要一致,即列数要和列表的长度相等。从输出结果可知,k1、k2、k3是按行从上到下放入DataFrame中的。
属性shape获取行数和列数,例如:
>>> df.shape #获取行和列
(3, 4)
>>> df.shape[0] #获取行
3
>>> df.shape[1] #获取列
4
>>> len(df) #获取行
3
属性index和columns可以获取行和列的标签,例如:
>>> df.index
RangeIndex(start=0, stop=3, step=1)
>>> df.columns
Index(['open', 'high', 'low', 'close'], dtype='object')
我们可以设置index和columns的names属性,即行和列标签的名称,例如:
>>> df.index.names
FrozenList([None])
>>> df.columns.names=['price']
>>> df.index.names=['id']
>>> df.columns.names
FrozenList(['price'])
>>> df.index.names
FrozenList(['id'])
>>> df
price open high low close
id
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>>
我们可用列的标签获取列数据,可以用“[ ]”和“.”两种方式,形式为df[col_label] 和 df.col_label,例如选择一列:
>>> df['open']
id
0 4266.0
1 4270.0
2 4270.0
Name: open, dtype: float64
>>> df.open
id
0 4266.0
1 4270.0
2 4270.0
Name: open, dtype: float64
>>>
通过标签获取一列数据返回值是Series结构。
如果选择多列,则把列标签放入列表中,再把列表放入切片操作符,形式为df[[col_label1, col_label2, col_label3]],例如:
>>> df[['open','low']]
price open low
id
0 4266.0 4265.0
1 4270.0 4270.0
2 4270.0 4267.0
>>>
我们可以用“[ ]”切片选取多行,例如:
>>> df[0:1]
price open high low close
id
0 4266.0 4272.0 4265.0 4270.0
>>> df[0:2]
price open high low close
id
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
>>> df[1:2]
price open high low close
id
1 4270.0 4273.0 4270.0 4270.0
>>>
切片不包含结束行,因此用“[ ]”切片相邻的两个行标签可以间接获取一行。
获取单个数据,可以先通过列标签选择数据所在的列,再选择数据所在的行,例如:
>>> df['open'][2]
4270.0
>>> df.open[2]
4270.0
>>>
获取数据还可以用loc和iloc属性,loc通过标签获取数据,iloc通过位置获取数据,形式为:df.loc[row_label, col_label] 和 df.iloc[row_loc, col_loc]。
df.loc[row_label, col_label]:row_label默认值为全部行,也可用切片选择多行,注意包含结束标签
col_label默认值为全部列,也可用标签选择多列
例如:
>>> df.loc[2] #选择2行全部列,返回值为Series结构
price
open 4270.0
high 4271.0
low 4267.0
close 4268.0
Name: 2, dtype: float64
>>> df.loc[:1] #选择行起始标签至标签1,包括1
price open high low close
id
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
>>> df.loc[1:2] #选择行起始标签1至标签2,包括2
price open high low close
id
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.loc[:,'open'] #选择'open'列,全部行
id
0 4266.0
1 4270.0
2 4270.0
Name: open, dtype: float64
>>> df.loc[:,['open','low']] #选择'open'列、'low'列,全部行
price open low
id
0 4266.0 4265.0
1 4270.0 4270.0
2 4270.0 4267.0
>>> df.loc[1:,['open','low']] #选择'open'列、'low'列,行起始标签1至末尾行
price open low
id
1 4270.0 4270.0
2 4270.0 4267.0
>>>
df.iloc[row_loc, col_loc],按位置选择,可像序列数据切片一样,切片的方向不同,位置序号可以有正负值:row_loc默认值为全部行,也可用切片选择多行,注意不包含结束位置序号
col_loc默认值为全部列,也可用切片选择多列
例如:
>>> df.iloc[1] #选择行号1,全部列,返回值为Series结构
price
open 4270.0
high 4273.0
low 4270.0
close 4270.0
Name: 1, dtype: float64
>>> df.iloc[-1] #选择行号-1(即末尾行),全部列,返回值为Series结构
price
open 4270.0
high 4271.0
low 4267.0
close 4268.0
Name: 2, dtype: float64
>>> df.iloc[1:2] #选择行号1-2,不包括2,全部列
price open high low close
id
1 4270.0 4273.0 4270.0 4270.0
>>> df.iloc[:,1] #选择全部行,列号1,返回值为Series结构
id
0 4272.0
1 4273.0
2 4271.0
Name: high, dtype: float64
>>> df.iloc[:,-1] #选择全部行,列号-1(即末尾列),返回值为Series结构
id
0 4270.0
1 4270.0
2 4268.0
Name: close, dtype: float64
>>> df.iloc[1:,-2:] #选择行号1至末尾行,最后2列
price low close
id
1 4270.0 4270.0
2 4267.0 4268.0
>>>
df.head(n),获取前n行数据,df.tail(n),获取后n行数据例如:
>>> df.head(2)
price open high low close
id
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
>>> df.tail(2)
price open high low close
id
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>>
df.index=['a','b','c'],修改行索引,df.columns=['m','n','p','q'],修改列索引,例如:
>>> df.index=['a','b','c']
>>> df.columns=['m','n','p','q']
>>> df
m n p q
a 4266.0 4272.0 4265.0 4270.0
b 4270.0 4273.0 4270.0 4270.0
c 4270.0 4271.0 4267.0 4268.0
>>>
astype():用来设置数据的类型,例如'int'、'float'、'str':
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.open.astype('int')
0 4266
1 4270
2 4270
Name: open, dtype: int32
>>> df.open.astype('float')
0 4266.0
1 4270.0
2 4270.0
Name: open, dtype: float64
>>> df.open.astype('str')
0 4266.0
1 4270.0
2 4270.0
Name: open, dtype: object
>>> df.astype('int')
open high low close
0 4266 4272 4265 4270
1 4270 4273 4270 4270
2 4270 4271 4267 4268
>>>
pandas的一些操作函数带有参数inplace或axis,inplace默认值为False,表示返回一个新的数据对象,inplace为True表示直接修改原数据;axis默认值为0,表示按纵向操作,即按行操作,axis为1表示按横向操作,即按列操作,0也可用'index'表示,1也可用'columns'表示。
df.set_index():设置某一列为索引,例如:
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.set_index('open')
high low close
open
4266.0 4272.0 4265.0 4270.0
4270.0 4273.0 4270.0 4270.0
4270.0 4271.0 4267.0 4268.0
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.set_index('open',inplace=True)
>>> df
high low close
open
4266.0 4272.0 4265.0 4270.0
4270.0 4273.0 4270.0 4270.0
4270.0 4271.0 4267.0 4268.0
>>> df.index
Float64Index([4266.0, 4270.0, 4270.0], dtype='float64', name='open')
>>>
执行df.set_index('open',inplace=True)把'open'列设置为行索引,且对原数据df修改。
df.reset_index():把行索引重置为整数,例如:
>>> df.reset_index(inplace=True)
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>>
df.rename():修改行或列的标签,参数传入映射类型,把原标签修改为新标签,可以修改单个或多个标签,传入不存在的标签默认不会报错,例如:
>>> df #原始数据
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename(columns={'open':'a','B':'b'}) #修改列标签'open'为'a','B'不存在忽略
a high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename({'open':'a','B':'b'},axis='columns') #修改列标签'open'为'a','B'不存在忽略
a high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename({'open':'a','B':'b'},axis=1) #修改列标签'open'为'a','B'不存在忽略
a high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename(index={1:'m','B':'b'}) #修改行标签1为'm','B'不存在忽略
open high low close
0 4266.0 4272.0 4265.0 4270.0
m 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename({1:'m','B':'b'},axis='index') #修改行标签1为'm','B'不存在忽略
open high low close
0 4266.0 4272.0 4265.0 4270.0
m 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename({1:'m','B':'b'},axis=0) #修改行标签1为'm','B'不存在忽略
open high low close
0 4266.0 4272.0 4265.0 4270.0
m 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df #原始数据未变
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.rename(index={1:'m','B':'b'},columns={'open':'a','B':'b'},inplace=True) #修改原始数据行列标签
>>> df
a high low close
0 4266.0 4272.0 4265.0 4270.0
m 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>>
对pandas数据赋值,可以直接修改pandas数据,例如:
>>> df #原始数据
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.open[1]=1234 #把'open'列1行的数据修改为1234
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 1234.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.high=[1,2,3] #把'high'列的数据修改为[1,2,3]
>>> df
open high low close
0 4266.0 1 4265.0 4270.0
1 1234.0 2 4270.0 4270.0
2 4270.0 3 4267.0 4268.0
>>>
df.drop():删除行或列,例如:
>>> df #原始数据
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.drop(['open'],axis=1) #删除'open'列
high low close
0 4272.0 4265.0 4270.0
1 4273.0 4270.0 4270.0
2 4271.0 4267.0 4268.0
>>> df.drop(['open','high'],axis=1) #删除'open'、'high'列
low close
0 4265.0 4270.0
1 4270.0 4270.0
2 4267.0 4268.0
>>> df.drop([0],axis=0) #删除0行
open high low close
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.drop([0,1],axis=0) #删除0、1行
open high low close
2 4270.0 4271.0 4267.0 4268.0
>>>
df.drop_duplicates(keep='first'):去除重复行,keep默认值'first'表示保留第一次出现的行,若为'last'表示保留最后一次出现的行,若为False表示删除所有重复行,例如:
>>> df #原始数据,2、3行重复
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
3 4270.0 4271.0 4267.0 4268.0
>>> df.drop_duplicates(keep='last') #保留最后一行3
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
3 4270.0 4271.0 4267.0 4268.0
>>> df.drop_duplicates(keep=False) #删除全部重复行
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
>>>
sum():求和,mean():均值,std():标准差,例如:
>>> df #原始数据
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.iloc[-2:,0].sum() #求位置第0列最后两行的和
8540.0
>>> df.iloc[-2:,0].mean() #求位置第0列最后两行的均值
4270.0
>>> df.iloc[-2:,0].std() #求位置第0列最后两行的标准差
0.0
>>>
max():最大值,min():最小值,例如:
>>> df
open high low close diff
0 4266.0 4272.0 4265.0 4270.0 -6.0
1 4270.0 4273.0 4270.0 4270.0 -3.0
2 4270.0 4271.0 4267.0 4268.0 -1.0
>>> df.high.max() #high列的最大值
4273.0
>>> df.high.min() #high列的最小值
4271.0
>>> df.iloc[-2:].low.max() #最后两行里,low列的最大值
4270.0
>>> df.iloc[-2:].low.min() #最后两行里,low列的最小值
4267.0
>>>
idxmax(0):一列中最大值所在的行,idxmax(1):一行中最大值所在的列,idxmin(0):一列中最小值所在的行,idxmin(1):一行中最小值所在的列。若无参数默认值为0,返回值是行和列的标签,当最大、最小值有重复时取第一个出现的行或列,例如:
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.high.idxmax(0) #high列最大值所在的行
1
>>> df.high.idxmin(0) #high列最小值所在的行
2
>>> df.iloc[2].idxmax(1) #第2行最大值所在的列
'high'
>>> df.iloc[2].idxmin(1) #第2行最小值所在的列
'low'
>>> df.close.idxmax(0) #close列最大值所在的行,取第一次出现的行
0
>>> df.iloc[1].idxmin(1) #第1行最小值所在的列,取第一次出现的列
'open'
>>> df.iloc[-2:].high.idxmax(0) #最后两行,high列最大值所在的行
1
>>> df.iloc[-2,1:3].idxmax(1) #第-2行,第1-2列最大值所在的列
'high'
>>>
df.append(data):把data按行追加到df,ignore_index默认False即不忽略data的索引,例如:
>>> df1
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df2
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df1.append(df2)
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df1.append(df2,ignore_index=True)
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
3 4266.0 4272.0 4265.0 4270.0
4 4270.0 4273.0 4270.0 4270.0
5 4270.0 4271.0 4267.0 4268.0
>>>
pd.concat([df1, df2],axis=0):轴向连接多个DateFrame数据,axis默认为0,即按行连接,例如:
>>> df1
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df2
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> pd.concat([df1, df2],axis=0)
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> pd.concat([df1, df2],axis=1)
open high low close open high low close
0 4266.0 4272.0 4265.0 4270.0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0 4270.0 4271.0 4267.0 4268.0
通过标签df[label]添加一列,例如:
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df['id']=['a','b','c']
>>> df
open high low close id
0 4266.0 4272.0 4265.0 4270.0 a
1 4270.0 4273.0 4270.0 4270.0 b
2 4270.0 4271.0 4267.0 4268.0 c
>>>
如果只给df[label]赋一个值,则将其赋值给该列所有值,例如:
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df['ma_B2.board']='B2'
>>> df
open high low close ma_B2.board
0 4266.0 4272.0 4265.0 4270.0 B2
1 4270.0 4273.0 4270.0 4270.0 B2
2 4270.0 4271.0 4267.0 4268.0 B2
>>>
对列做运算,例如:
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df['diff']=df.open - df.high #open列的值减去high列的值,结果添加到diff列
>>> df
open high low close diff
0 4266.0 4272.0 4265.0 4270.0 -6.0
1 4270.0 4273.0 4270.0 4270.0 -3.0
2 4270.0 4271.0 4267.0 4268.0 -1.0
>>>
通过标签df.loc[label]添加一行,例如:
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df.loc['a']=[1,2,3,4]
>>> df
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
a 1.0 2.0 3.0 4.0
>>>
map():Series对象的一个函数,map()将一个自定义函数作用于Series对象的每个元素,例如:
>>> df #原始数据
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
>>> df['open']=df['open'].map(lambda x:x*2) #把'open'列每一个元素乘以2
>>> df
open high low close
0 8532.0 4272.0 4265.0 4270.0
1 8540.0 4273.0 4270.0 4270.0
2 8540.0 4271.0 4267.0 4268.0
>>>
apply():将DateFrame的一行或多行,或者一列或多列的元素应用于自定义函数,例如:
>>> df #原始数据
open high low close
0 4266.0 4272.0 4265.0 4270.0
1 4270.0 4273.0 4270.0 4270.0
2 4270.0 4271.0 4267.0 4268.0
a 1.0 2.0 3.0 4.0
>>> df['open']=df['open'].apply(lambda x:x*2) #'open'列的元素乘以2
>>> df
open high low close
0 8532.0 4272.0 4265.0 4270.0
1 8540.0 4273.0 4270.0 4270.0
2 8540.0 4271.0 4267.0 4268.0
a 2.0 2.0 3.0 4.0
>>> df.loc['a']=df.loc['a'].apply(lambda x:x*2) #'a'行的元素乘以2
>>> df
open high low close
0 8532.0 4272.0 4265.0 4270.0
1 8540.0 4273.0 4270.0 4270.0
2 8540.0 4271.0 4267.0 4268.0
a 4.0 4.0 6.0 8.0
>>> df['b']=df[['open','high']].apply(lambda x:x.sum(),axis=1) #'open'和'high'列的元素求和
>>> df
open high low close b
0 8532.0 4272.0 4265.0 4270.0 12804.0
1 8540.0 4273.0 4270.0 4270.0 12813.0
2 8540.0 4271.0 4267.0 4268.0 12811.0
a 4.0 4.0 6.0 8.0 8.0
applymap():将自定义函数作用于DataFrame的所有元素,例如:
>>> df #原始数据
open high low close b
0 8532.0 4272.0 4265.0 4270.0 12804.0
1 8540.0 4273.0 4270.0 4270.0 12813.0
2 8540.0 4271.0 4267.0 4268.0 12811.0
a 4.0 4.0 6.0 8.0 8.0
>>> df=df.apply(lambda x:x*2) #所有元素乘以2
>>> df
open high low close b
0 17064.0 8544.0 8530.0 8540.0 25608.0
1 17080.0 8546.0 8540.0 8540.0 25626.0
2 17080.0 8542.0 8534.0 8536.0 25622.0
a 8.0 8.0 12.0 16.0 16.0
>>>
15.3、文件读写:
pd.read_csv()从CSV文件读取到DataFrame,可直接读取文件,参数: file,文件路径; sep,分隔符; index_col,用作行索引的一列或者多列; usecols,选择列; encoding,字符编码类型,通常为’utf-8’。但有的文件直接读取可能会报编码错误,推荐先用open()函数打开文件再读取,df.to_csv()把DataFrame写入CSV文件,例如:
data = open(r'C:\export\MA.csv')
df = pd.read_csv(data,header=None,dtype=object) #以字符串类型读取表格,无列名
df.to_csv(r'C:\export\MA.csv',index=False,header=False) #写入文件,不包含行列标签
read_csv的参数header=None表示读取文件时不把第一行作为列标签,自动使用整数作为列标签,行标签也自动使用整数,默认会把数值读取成浮点型数据或整型数据,可用dtype=object强制把所有数据读取成字符串,to_csv写入文件时,默认的整数标签若不需要可以不用写入。
pandas的用法还很多,更多用法可查阅pandas相关资料。