9-Python 科学计算_pandas 篇

课程概要:
  1、pandas 库之数据筛选及过滤
  2、pandas 库之字符串提取与操作
  3、pandas库之散点图
  4、pandas 库之直方图

1、pandas 库之数据筛选及过滤

>>> import numpy as np
>>> import pandas as pd
>>> dates = pd.date_range('20160101',periods=6)     #  从当前日期往后生成6个日期元素
>>> dates
<class 'pandas.tseries.index.DatetimeIndex'>
[2016-01-01, ..., 2016-01-06]
Length: 6, Freq: D, Timezone: None
>>> df = pd.DataFrame(np.random.rand(6,4),index=dates,columns=list('ABCD'))
        #   DataFrame 不可以小写
        #   np.random.rand(6,4),随机生成一个6*4的矩阵,其元素介于0-1之间
        #   index=dates 索引按照dates的日期元素作为索引
        #   columns=list('ABCD'),列名为A,B,C,D
>>> df
                   A         B         C         D
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522
2016-01-06  0.028161  0.169375  0.637185  0.271154

[6 rows x 4 columns]
>>> df2 = pd.DataFrame({'A':np.random.rand(6)})
>>> df2
          A
0  0.942403
1  0.849205
2  0.745943
3  0.741686
4  0.916450
5  0.480425

[6 rows x 1 columns]
>>> df3 = pd.DataFrame({'A':np.random.rand(6)},index=dates)
>>> df3
                   A
2016-01-01  0.954572
2016-01-02  0.673110
2016-01-03  0.991391
2016-01-04  0.662053
2016-01-05  0.191929
2016-01-06  0.896591

[6 rows x 1 columns]
>>> df['A']         
2016-01-01    0.144196
2016-01-02    0.256549
2016-01-03    0.090722
2016-01-04    0.569605
2016-01-05    0.125042
2016-01-06    0.028161
Freq: D, Name: A, dtype: float64
>>> df[1:3]                 
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326

[2 rows x 4 columns]
>>> df['20160102':'20160104']       #   行切片,注意这个切片是取到右边
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195

[3 rows x 4 columns]
df.loc['20160101':'20160104',['A','B']]
                   A         B
2016-01-01  0.144196  0.647273
2016-01-02  0.256549  0.141528
2016-01-03  0.090722  0.565770
2016-01-04  0.569605  0.011851

[4 rows x 2 columns]
>>> df.at[dates[0],'A']
0.14419598649708365
>>> df.dtypes
A    float64
B    float64
C    float64
D    float64
dtype: object
>>> df.head()           #   查看前5行,默认的就是 n=5
                   A         B         C         D
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522

[5 rows x 4 columns]
>>> df.head(3)      #   查看前3行
                   A         B         C         D
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326

[3 rows x 4 columns]
>>> df.tail()           #   查看后5行
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522
2016-01-06  0.028161  0.169375  0.637185  0.271154

[5 rows x 4 columns]
>>> df.tail(3)
                   A         B         C         D
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522
2016-01-06  0.028161  0.169375  0.637185  0.271154

[3 rows x 4 columns]
>>> df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2016-01-01, ..., 2016-01-06]
Length: 6, Freq: D, Timezone: None
>>> df.columns
Index([u'A', u'B', u'C', u'D'], dtype='object')
>>> df.values
array([[ 0.14419599,  0.6472727 ,  0.08579066,  0.75429817],
       [ 0.25654929,  0.1415283 ,  0.04540702,  0.92560391],
       [ 0.09072181,  0.56576979,  0.07799159,  0.37032625],
       [ 0.56960508,  0.01185102,  0.84449454,  0.05919541],
       [ 0.1250417 ,  0.43677787,  0.91123057,  0.13352195],
       [ 0.02816118,  0.16937545,  0.63718452,  0.27115381]])
>>> df.describe()
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.202379  0.328763  0.433683  0.419017
std    0.194923  0.256976  0.409032  0.347637
min    0.028161  0.011851  0.045407  0.059195
25%    0.099302  0.148490  0.079941  0.167930
50%    0.134619  0.303077  0.361488  0.320740
75%    0.228461  0.533522  0.792667  0.658305
max    0.569605  0.647273  0.911231  0.925604

[8 rows x 4 columns]
>>> df.T
   2016-01-01  2016-01-02  2016-01-03  2016-01-04  2016-01-05  2016-01-06
A    0.144196    0.256549    0.090722    0.569605    0.125042    0.028161
B    0.647273    0.141528    0.565770    0.011851    0.436778    0.169375
C    0.085791    0.045407    0.077992    0.844495    0.911231    0.637185
D    0.754298    0.925604    0.370326    0.059195    0.133522    0.271154

[4 rows x 6 columns]
>>> df.sort(columns='C')        #   按照C列进行排序
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-06  0.028161  0.169375  0.637185  0.271154
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522

[6 rows x 4 columns]
>>> df = pd.DataFrame(np.random.randn(6,4),columns=list('abcd'))
>>> df
          a         b         c         d
0  1.198543 -1.868721  1.745448 -1.036422
1 -0.529202 -0.012269  0.969534  0.023551
2  1.630468 -1.562662  0.396634  0.483880
3  0.113079 -0.791460  1.127796  1.232607
4  0.012088  0.848480 -1.202130 -0.066336
5 -0.937329 -0.798681 -1.716528 -0.528337

[6 rows x 4 columns]
>>> df[df.d > 0]        #   选出d列
          a         b         c         d
1 -0.529202 -0.012269  0.969534  0.023551
2  1.630468 -1.562662  0.396634  0.483880
3  0.113079 -0.791460  1.127796  1.232607

[3 rows x 4 columns]
>>> df[df.d > 0] & df[df.c < 0]
    a   b   c   d
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN

[5 rows x 4 columns]
>>> df[df.c < 0][['a','b']]
          a         b
4  0.012088  0.848480
5 -0.937329 -0.798681

[2 rows x 2 columns]

2、pandas 库之字符串提取与操作

>>> import pandas as pd
>>> s = pd.Series(list('ABCDEF'))       #   产生的是一个字符串的序列(n*1)
>>> s
0    A
1    B
2    C
3    D
4    E
5    F
dtype: object
>>> s.str.lower()       #   将字符串的字母小写
0    a
1    b
2    c
3    d
4    e
5    f
dtype: object
>>> s.str.upper()       #   将字符串的字母大写
0    A
1    B
2    C
3    D
4    E
5    F
dtype: object
>>> s.str.replace('A','B')          #   替换,将s序列中所有的字母A替换成B
0    B
1    B
2    C
3    D
4    E
5    F
dtype: object
>>> s = pd.Series(['a1','a2','a3','a4'])
>>> s
0    a1
1    a2
2    a3
3    a4
dtype: object
#   提取字符串
>>> s.str.extract('[ab](\d)')       #   正则表达式
0    1                      #   [ab] 表示匹配内容是a,b字符中其中一个
1    2                      #   (\d)::\d表示匹配的是整型
2    3                      #         :( ) 表示返回的内容
3    4
dtype: object
>>> s.str.extract('([abc])(\d)')        #   返回的是两列
   0  1
0  a  1
1  a  2
2  a  3
3  a  4

[4 rows x 2 columns]
>>> s.str.extract('([abc]\d)')
0    a1
1    a2
2    a3
3    a4
dtype: object
>>> s.str.extract('(?P<str>[abc])(?P<digit>(\d))')      #   ?:匹配前面的子表达式零次或一次
  str digit  2      #   ?P:非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用
0   a     1  1
1   a     2  2
2   a     3  3
3   a     4  4

[4 rows x 3 columns]
>>> s = pd.Series(['a','B','c','d'])
>>> pattern = r'[a-z]'
>>> s.str.contains(pattern)
0     True
1    False
2     True
3     True
dtype: bool
>>> pattern = r'A-Za-z]'
>>> s.str.contains(pattern)
0    False
1    False
2    False
3    False
dtype: bool
>>> s = pd.Series(['ab','Ba','c','d'])
>>> s.str.contains('^a')            #   ^a 表示匹配以a开头的字母
0     True  
1    False
2    False
3    False
dtype: bool
>>> s.str.startswith('a')
0     True
1    False
2    False
3    False
dtype: bool
>>> s.str.endswith('a')
0    False
1     True
2    False
3    False
dtype: bool
>>> s.str.contains('a$')        #   a$ 表示匹配以a 结尾
0    False
1     True
2    False
3    False
dtype: bool

三、pandas 库之散点图

#   如何读取Excel中的数据
>>> df = pd.read_excel(r'D:\Doc_Py\test.xls','Sheet1',index_col=0)
        #   三个参数:①路径;②标签;③index_col = 0 让excel中默认索引值不显示
>>> df
    child  parent
id               
1      10      30
2      11      31
3      12      32
4      13      33
5      14      34
6      15      35
7      16      36
8      17      37
9      18      38
10     19      39
11     20      40

[11 rows x 2 columns]
>>> df1 = pd.read_excel(r'D:\Doc_Py\test.xls','Sheet1')
>>> df1
    id  child  parent
0    1     10      30
1    2     11      31
2    3     12      32
3    4     13      33
4    5     14      34
5    6     15      35
6    7     16      36
7    8     17      37
8    9     18      38
9   10     19      39
10  11     20      40

[11 rows x 3 columns]
>>> pl = df.plot(kind='scatter',x='child',y='parent').get_figure()
>>> pl.savefig(r'D:\1.jpg')
import pandas as pd
import numpy as np

def func(ser,factor):
    ''' ser:传入的序列,factor:传入的抖动值
    '''
    z = float(ser.max())-float(ser.min())
    a = float(factor)*z/50
    return ser.apply(lambda x:x+np.random.uniform(-a,a))
        #   np.random.uniform(-a,a) :-a和a之间随机浮点数
    
df = pd.read_excel(r'D:\Doc_Py\test.xls','Sheet1',index_col=0)
df['child']=func(df['child'],1)
df['parent'] = func(df['parent'],1)

plt = df.plot(kind='scatter',x='child',y='parent').get_figure()
plt.savefig(r'D:\2.jpg')
from statsmodels.formula.api import ols     
#   statsmodels.formula.api是统计建模的工具包,ols 是建立一个线性回归方程
#   使用statsmodels时要求有patsy这个库
import matplotlib.pyplot as  plt    
import numpy as np
import pandas as pd

path = r'D:\Doc_Py\test.xls'
df = pd.read_excel(path,'Sheet1',index_col=0)
l = ols('child~parent',df).fit()        #   ols 以parent 为自变量建立线性回归方程

plt.plot(df['parent'],df['child'],'ob') #   传入parent和child的值,先绘制散点图
    #   ‘ob’ 表示散点使用蓝色原点标记
plt.plot(df['parent'],l.fittedvalues,'r',linewidth=2)   #   l.fittedvalues:回归方程的预测的值
                        #   ‘r’ 表示红色线,再绘制出线性回归方程的拟合线
plt.show()

四、pandas 库之直方图

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
plt = df.plot(kind='bar').get_figure()      #   kind=’bar’,表示为柱形图
plt.savefig(r'D:\4.jpg')
import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
pd.set_option('mpl_style','default')        #   设置mpl格式
plt = df.plot(kind='bar').get_figure()
plt.savefig(r'D:\4-2.jpg')
df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
pd.set_option('mpl_style','default')
plt = df.plot(kind='bar',stacked=True).get_figure()     #   stacked=True:设置堆积模式
plt.savefig(r'D:\4.jpg')        #   可以覆盖掉前面的图片文件
df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
pd.set_option('mpl_style','default')
plt = df.plot(kind='barh',stacked=True).get_figure()        #   设置水平样式
plt.savefig(r'D:\4.jpg')
df = pd.DataFrame(np.random.rand(100,4),columns=list('abcd'))
d = df['a'].hist().get_figure()
d.savefig(r'D:\4.jpg')
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

pd.set_option('mpl_style','default')
fig,ax = plt.subplots()
df = pd.DataFrame(np.random.rand(100,2),columns=list('ab'))
df.boxplot(ax=ax)
d.savefig(r'D:\4.jpg')          #   这里是不能使用show( )的
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pandas.util.testing as tm

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

推荐阅读更多精彩内容

  • 参考:https://amaozhao.gitbooks.io/pandas-notebook/content/h...
    与尔岩说阅读 8,611评论 0 26
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,726评论 25 707
  • 时间:2015.3.14 地点:北大医学部逸夫楼108 主讲人:强生校园招聘经理 Yolanda 此次讲座作为内部...
    碧碧阅读 2,196评论 0 4
  • 语文: 今天学习的“专”“奶”分别一字一音加笔顺和两个词。 数学: 数学新课基本结束了,今天的作业是订正数学书89...
    瑞睿家阅读 148评论 0 0
  • 冬季到来,比以往都要冷上许多,我路过熟悉的那条街道,一阵忧伤积在心头……我已经不记得在那三年里多少次同她沿着这...
    终成梦阅读 184评论 0 2