零基础学Python--不得不说的Pandas小技巧

在前面的文章里,我介绍了如何使用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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • 数据分析和建模方面的大量编程工作都是用在数据准备上的:加载、清理、转换、重塑。是因为,多数时候存放在文件或数据库中...
    凌岸_ing阅读 2,285评论 0 4
  • 目录: 5.1 pandas 的数据结构介绍 5.1.1 Series 5.1.2 DataFrame 5.1.3...
    凌岸_ing阅读 4,748评论 0 17
  • 文 | 新浪科技《科学大家》 在宇宙的长河中,地球的历史大概有46亿年。38亿年前,生命诞生,而人类的历史也只有短...
    雨亭书斋阅读 1,137评论 0 4
  • 今天,虽然是阳春三月,却遇到了难见的“倒春寒”,上午细雨纷飞,冷风凛冽。街上的行人纷纷穿上羽绒服,来抵挡风中那刺骨...
    枫红云天阅读 747评论 13 14