在前面的文章里,我介绍了如何使用Pandas去读写一个CSV文件,其实Pandas的功能还不仅仅限于此,它还可以读写Excel、Hdf、html、Json等多种文件格式。除此以外,Pandas还拥有众多的数据处理的功能。尤其我们在处理大数据的时候,Pandas就显得额外的功能强大。
用过Numpy的同学可能会觉得Numpy已经是非常的好用了,但是一旦当你把Pandas和Numpy结合起来,那感觉正是:金风玉露一相逢,便胜却人间无数。
今天我们就来讲Pandas的一些使用方法和技巧,作为大家在写Python程序时候的查阅笔记来使用。
我们仍然使用我们之前使用过的OHLCV数据作为示例,当然有些技巧中这个示例可能不足以表现其功能的强大,我们会适时的对数据进行一些修改。为了照顾没有读过以前文章的同学,我们照例贴出我们的CSV文件内容,其中‘>’符号作为缩进使用。
>>>>date,open,high,low,close
19991110,29.5,29.8,27.0,27.75
19991111,27.58,28.38,27.53,27.71
19991112,27.86,28.3,27.77,28.05
19991115,28.2,28.25,27.7,27.75
19991116,27.88,27.97,26.48,26.55
19991117,26.5,27.18,26.37,27.18
19991118,27.2,27.58,26.78,27.02
19991119,27.5,27.53,26.8,26.88
19991122,26.88,26.95,26.3,26.45
19991123,26.45,26.55,26.1,26.45
打印Dataframe的信息
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
df.info()
运行结果:
RangeIndex: 10 entries, 0 to 9
Data columns (total 5 columns):
date 10 non-null int64
open 10 non-null float64
high 10 non-null float64
low 10 non-null float64
close 10 non-null float64
dtypes: float64(4), int64(1)
memory usage: 480.0 bytes
我们可以看到这个Dataframe的数据类型以及一些统计信息。
取Dataframe的前N行
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.head(3))
运行结果:
>>>>date open high low close
0 19991110 29.50 29.80 27.00 27.75
1 19991111 27.58 28.38 27.53 27.71
2 19991112 27.86 28.30 27.77 28.05
删除一行
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.drop(2, axis=0))
运行结果:
>>>>date open high low close
0 19991110 29.50 29.80 27.00 27.75
1 19991111 27.58 28.38 27.53 27.71
3 19991115 28.20 28.25 27.70 27.75
4 19991116 27.88 27.97 26.48 26.55
5 19991117 26.50 27.18 26.37 27.18
6 19991118 27.20 27.58 26.78 27.02
7 19991119 27.50 27.53 26.80 26.88
8 19991122 26.88 26.95 26.30 26.45
9 19991123 26.45 26.55 26.10 26.45
删除一列
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.drop('date', axis=1))
运行结果:
>>>>open high low close
0 29.50 29.80 27.00 27.75
1 27.58 28.38 27.53 27.71
2 27.86 28.30 27.77 28.05
3 28.20 28.25 27.70 27.75
4 27.88 27.97 26.48 26.55
5 26.50 27.18 26.37 27.18
6 27.20 27.58 26.78 27.02
7 27.50 27.53 26.80 26.88
8 26.88 26.95 26.30 26.45
9 26.45 26.55 26.10 26.45
删除有空值的行或者列
我们预先对文件ohlcv.txt进行一下修改,我们添加一个列名。
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df)
我们打印出来的结果为:
>>>>date open high low close volume
0 19991110 29.50 29.80 27.00 27.75 NaN
1 19991111 27.58 28.38 27.53 27.71 NaN
2 19991112 27.86 28.30 27.77 28.05 NaN
3 19991115 28.20 28.25 27.70 27.75 NaN
4 19991116 27.88 27.97 26.48 26.55 NaN
5 19991117 26.50 27.18 26.37 27.18 NaN
6 19991118 27.20 27.58 26.78 27.02 NaN
7 19991119 27.50 27.53 26.80 26.88 NaN
8 19991122 26.88 26.95 26.30 26.45 NaN
9 19991123 26.45 26.55 26.10 26.45 NaN
这下我们有一个拥有空值得Dataframe了,我们接下来来去掉含有空值的列。
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.dropna(axis=1))
运行结果为:
>>>>date open high low close
0 19991110 29.50 29.80 27.00 27.75
1 19991111 27.58 28.38 27.53 27.71
2 19991112 27.86 28.30 27.77 28.05
3 19991115 28.20 28.25 27.70 27.75
4 19991116 27.88 27.97 26.48 26.55
5 19991117 26.50 27.18 26.37 27.18
6 19991118 27.20 27.58 26.78 27.02
7 19991119 27.50 27.53 26.80 26.88
8 19991122 26.88 26.95 26.30 26.45
9 19991123 26.45 26.55 26.10 26.45
接下来我们来删除拥有空值的行,由于我们每一行都有空值,我们来看一下是否如我们所料。
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.dropna())
果然,我们发现运行结果如下:
Empty DataFrame
Columns: [date, open, high, low, close, volume]
Index: []
将空值设为指定值
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.fillna(0.0))
运行结果:
>>>>date open high low close volume
0 19991110 29.50 29.80 27.00 27.75 0.0
1 19991111 27.58 28.38 27.53 27.71 0.0
2 19991112 27.86 28.30 27.77 28.05 0.0
3 19991115 28.20 28.25 27.70 27.75 0.0
4 19991116 27.88 27.97 26.48 26.55 0.0
5 19991117 26.50 27.18 26.37 27.18 0.0
6 19991118 27.20 27.58 26.78 27.02 0.0
7 19991119 27.50 27.53 26.80 26.88 0.0
8 19991122 26.88 26.95 26.30 26.45 0.0
9 19991123 26.45 26.55 26.10 26.45 0.0
对某一行或列进行运算
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.loc[:,'open'].apply(lambda x: x-1.0))
print(df.loc[1,:].apply(lambda x: x*2))
运行结果:
0 28.50
1 26.58
2 26.86
3 27.20
4 26.88
5 25.50
6 26.20
7 26.50
8 25.88
9 25.45
Name: open, dtype: float64
date 39982222.00
open 55.16
high 56.76
low 55.06
close 55.42
volume NaN
Name: 1, dtype: float64
我们可以看到分别打印出的结果都是对原来的行和列进行了相应的运算,NaN的结果是因为我们原本读出来的Dataframe有空值。
并且,我们这里用了lambda和apply。也就是说并不仅仅限于运算,你可以以任何你需要的方式进行使用。
条件选取部分元素
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.loc[df['date'] == 19991119,['date', 'close']])
运行结果:
>>>>date close
7 19991119 26.88
我们可以看到打印的结果为19991119这一天里的date和close值,如果我们想打印整行,则可以用:
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.loc[df['date'] == 19991119])
运行结果:
>>>>date open high low close volume
7 19991119 27.5 27.53 26.8 26.88 NaN
对Dataframe以某列排序
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.sort_values(['date'],ascending=False))
运行结果:
>>>>date open high low close volume
9 19991123 26.45 26.55 26.10 26.45 NaN
8 19991122 26.88 26.95 26.30 26.45 NaN
7 19991119 27.50 27.53 26.80 26.88 NaN
6 19991118 27.20 27.58 26.78 27.02 NaN
5 19991117 26.50 27.18 26.37 27.18 NaN
4 19991116 27.88 27.97 26.48 26.55 NaN
3 19991115 28.20 28.25 27.70 27.75 NaN
2 19991112 27.86 28.30 27.77 28.05 NaN
1 19991111 27.58 28.38 27.53 27.71 NaN
0 19991110 29.50 29.80 27.00 27.75 NaN
我们进行了逆序排列,大家可以看到index的序号是逆序的。
数据可视化
我们以直方图为例:
import pandas as pd
import matplotlib.pyplot as plt
file = 'ohlcv.txt'
df = pd.read_csv(file)
df.hist()
plt.show()
运行结果如下图:
loc与iloc
这两个都是用来索引Dataframe的,看名字大家就应该知道区别了,iloc是纯用index来进行索引,而loc则可以用Name。我们下面来看几个例子。
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.loc[1:3,['date','close']])
运行结果:
>>>>date close
1 19991111 27.71
2 19991112 28.05
3 19991115 27.75
大家注意在使用loc的时候,并不是像我们切片一样使用的是实际的行号。也就是说,如果是按照切片的方式,是不包含‘3’这一行的。下面我们用iloc来比较一下就比较清楚了。
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df.iloc[1:3, 0:2])
运行结果:
>>>>date open
1 19991111 27.58
2 19991112 27.86
重命名列名
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
df.columns = ['D', 'O', 'H', 'L', 'C', 'V']
print(df)
运行结果:
>>>>D O H L C V
0 19991110 29.50 29.80 27.00 27.75 NaN
1 19991111 27.58 28.38 27.53 27.71 NaN
2 19991112 27.86 28.30 27.77 28.05 NaN
3 19991115 28.20 28.25 27.70 27.75 NaN
4 19991116 27.88 27.97 26.48 26.55 NaN
5 19991117 26.50 27.18 26.37 27.18 NaN
6 19991118 27.20 27.58 26.78 27.02 NaN
7 19991119 27.50 27.53 26.80 26.88 NaN
8 19991122 26.88 26.95 26.30 26.45 NaN
9 19991123 26.45 26.55 26.10 26.45 NaN
修改一列的数据类型
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df['date'].astype(float))
运行结果:
0 19991110.0
1 19991111.0
2 19991112.0
3 19991115.0
4 19991116.0
5 19991117.0
6 19991118.0
7 19991119.0
8 19991122.0
9 19991123.0
注意这个操作仅仅可对Dataframe的一个Series进行,Dataframe的一行或者一列称之为一个Series。
替换某行或者某列中的值
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df['date'].replace(19991117, 88888888))
运行结果:
0 19991110
1 19991111
2 19991112
3 19991115
4 19991116
5 88888888
6 19991118
7 19991119
8 19991122
9 19991123
Name: date, dtype: int64
选取满足特定条件的行列值
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
print(df[(df['date']>19991116) & (df['date']<19991120)])
注意这里是Bool判断,不要用逻辑与‘and’。
运行结果:
>>>>date open high low close volume
5 19991117 26.5 27.18 26.37 27.18 NaN
6 19991118 27.2 27.58 26.78 27.02 NaN
7 19991119 27.5 27.53 26.80 26.88 NaN
重置索引号
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
df = df[(df['date']>19991116) & (df['date']<19991120)]
df = df.reset_index()
运行结果:
>>>>index date open high low close volume
0 5 19991117 26.5 27.18 26.37 27.18 NaN
1 6 19991118 27.2 27.58 26.78 27.02 NaN
2 7 19991119 27.5 27.53 26.80 26.88 NaN
根据某一列值进行分组
我们先给Dataframe添加一名为‘code’的列,它的值有三种:‘APPLE'、’AMD‘和’AMAZON‘。分组后我们将获得三个Dataframe。
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
df.loc[:,'code'] = 'APPLE'
df.loc[3:6, 'code'] = 'AMD'
df.loc[7:9, 'code'] = 'AMAZON'
for code, edf in df.groupby(['code']):
>>>>print(code)
>>>>print(edf)
运行结果:
AMAZON
>>>>date open high low close volume code
7 19991119 27.50 27.53 26.8 26.88 NaN AMAZON
8 19991122 26.88 26.95 26.3 26.45 NaN AMAZON
9 19991123 26.45 26.55 26.1 26.45 NaN AMAZON
AMD
>>>>date open high low close volume code
3 19991115 28.20 28.25 27.70 27.75 NaN AMD
4 19991116 27.88 27.97 26.48 26.55 NaN AMD
5 19991117 26.50 27.18 26.37 27.18 NaN AMD
6 19991118 27.20 27.58 26.78 27.02 NaN AMD
APPLE
>>>>date open high low close volume code
0 19991110 29.50 29.80 27.00 27.75 NaN APPLE
1 19991111 27.58 28.38 27.53 27.71 NaN APPLE
2 19991112 27.86 28.30 27.77 28.05 NaN APPLE
按行合并两个Dataframe
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
df1 = df.loc[0:3,:]
df2 = df.loc[4:9,:]
df3 = df1.append(df2)
print(df3)
我们先将Dataframe切片成两个,然后进行合并,运行结果如下:
>>>>date open high low close volume
0 19991110 29.50 29.80 27.00 27.75 NaN
1 19991111 27.58 28.38 27.53 27.71 NaN
2 19991112 27.86 28.30 27.77 28.05 NaN
3 19991115 28.20 28.25 27.70 27.75 NaN
4 19991116 27.88 27.97 26.48 26.55 NaN
5 19991117 26.50 27.18 26.37 27.18 NaN
6 19991118 27.20 27.58 26.78 27.02 NaN
7 19991119 27.50 27.53 26.80 26.88 NaN
8 19991122 26.88 26.95 26.30 26.45 NaN
9 19991123 26.45 26.55 26.10 26.45 NaN
两个Dataframe按列进行合并
import pandas as pd
file = 'ohlcv.txt'
df = pd.read_csv(file)
df1 = df.iloc[:,0:4]
df2 = df.iloc[:,4:6]
df3 = pd.concat([df1, df2],axis=1)
print(df3)
运行结果:
>>>>date open high low close volume
0 19991110 29.50 29.80 27.00 27.75 NaN
1 19991111 27.58 28.38 27.53 27.71 NaN
2 19991112 27.86 28.30 27.77 28.05 NaN
3 19991115 28.20 28.25 27.70 27.75 NaN
4 19991116 27.88 27.97 26.48 26.55 NaN
5 19991117 26.50 27.18 26.37 27.18 NaN
6 19991118 27.20 27.58 26.78 27.02 NaN
7 19991119 27.50 27.53 26.80 26.88 NaN
8 19991122 26.88 26.95 26.30 26.45 NaN
9 19991123 26.45 26.55 26.10 26.45 NaN
到这里我们对于Pandas的技巧就介绍结束了,当然,其实这些仅仅是Pandas的常用用法。Pandas作为数据科学家们最钟爱的Python包之一,其功能强大可见一斑。其实关于任何一门语言的学习,最重要的还是多写多用,所谓的高手,唯手熟尔。当然,这是在正确的方法的前提下,所以说,Open your mind是非常重要的,大部分人学习新的东西容易半途而废往往是因为自己对新事物的抗拒打败了自己。
人工智能与深度学习做量化请关注:AI量化(https://t.zsxq.com/RvfY37y) 星球限时免费,如需加入,请私信我获得免费邀请码!
零基础学习Python与深度学习应用请关注星球:Python与深度学习 https://t.zsxq.com/bUFayZ3
微信公众号:QTechAI