最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 數(shù)據(jù)處理庫(kù) pandas進(jìn)階教程

 更新時(shí)間:2018年04月21日 21:52:30   作者:強(qiáng)波  
在前面一篇文章中,我們對(duì)pandas做了一些入門(mén)介紹。本文是它的進(jìn)階篇。在這篇文章中,我們會(huì)講解一些更深入的知識(shí)

前言

本文緊接著前一篇的入門(mén)教程,會(huì)介紹一些關(guān)于pandas的進(jìn)階知識(shí)。建議讀者在閱讀本文之前先看完pandas入門(mén)教程

同樣的,本文的測(cè)試數(shù)據(jù)和源碼可以在這里獲取: Github:pandas_tutorial 。

數(shù)據(jù)訪(fǎng)問(wèn)

在入門(mén)教程中,我們已經(jīng)使用過(guò)訪(fǎng)問(wèn)數(shù)據(jù)的方法。這里我們?cè)偌锌匆幌隆?/p>

注:這里的數(shù)據(jù)訪(fǎng)問(wèn)方法既適用于Series,也適用于DataFrame。

基礎(chǔ)方法:[]和.

這是兩種最直觀的方法,任何有面向?qū)ο缶幊探?jīng)驗(yàn)的人應(yīng)該都很容易理解。下面是一個(gè)代碼示例:

# select_data.py

import pandas as pd
import numpy as np

series1 = pd.Series([1, 2, 3, 4, 5, 6, 7],
 index=["C", "D", "E", "F", "G", "A", "B"])

print("series1['E'] = {} \n".format(series1['E']));
print("series1.E = {} \n".format(series1.E));

這段代碼輸出如下:

series1['E'] = 3
series1.E = 3

注1:對(duì)于類(lèi)似屬性的訪(fǎng)問(wèn)方式.來(lái)說(shuō),要求索引元素必須是有效的Python標(biāo)識(shí)符的時(shí)候才可以,而對(duì)于series1.1這樣的索引是不行的。

注2:[]和.提供了簡(jiǎn)單和快速訪(fǎng)問(wèn)pands數(shù)據(jù)結(jié)構(gòu)的方法。這種方法非常的直觀。然而,由于要訪(fǎng)問(wèn)的數(shù)據(jù)類(lèi)型并不是事先知道的,因此使用這兩種方法方式存在一些優(yōu)化限制。因此對(duì)于產(chǎn)品級(jí)的代碼來(lái)說(shuō),pandas官方建議使用pandas庫(kù)中提供的數(shù)據(jù)訪(fǎng)問(wèn)方法。

loc與iloc

在入門(mén)教程中,我們已經(jīng)提到了這兩個(gè)操作符:

  • loc:通過(guò)行和列的索引來(lái)訪(fǎng)問(wèn)數(shù)據(jù)
  • iloc:通過(guò)行和列的下標(biāo)來(lái)訪(fǎng)問(wèn)數(shù)據(jù)

注意:索引的類(lèi)型可能是整數(shù)。

實(shí)際上,當(dāng)DataFrame通過(guò)這兩個(gè)操作符訪(fǎng)問(wèn)數(shù)據(jù),可以只指定一個(gè)索引來(lái)訪(fǎng)問(wèn)一行的數(shù)據(jù),例如:

# select_data.py

df1 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"],
 "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]},
 index=['1', '2', '3', '4', '5', '6', '7'])
print("df1.loc['2']:\n{}\n".format(df1.loc['2']))

這里通過(guò)索引'2'可以方法到第2行的所有數(shù)據(jù),因此它的輸出如下:

df1.loc['2']:
note D
weekday Tue
Name: 2, dtype: object

除此之外,通過(guò)這兩個(gè)操作符我們還可以訪(fǎng)問(wèn)某個(gè)范圍之內(nèi)的數(shù)據(jù),例如這樣:

# select_data.py

print("series1.loc['E':'A']=\n{}\n".format(series1.loc['E':'A']));
print("df1.iloc[2:4]=\n{}\n".format(df1.iloc[2:4]))

這段代碼輸出如下:

series1.loc['E':'A']=
E    3
F    4
G    5
A    6
dtype: int64

df1.iloc[2:3]=
  note weekday
3    E     Wed
4    F     Thu

at與iat

這兩個(gè)操作符用來(lái)訪(fǎng)問(wèn)單個(gè)的元素值(Scalar Value)。類(lèi)似的:

  • at:通過(guò)行和列的索引來(lái)訪(fǎng)問(wèn)數(shù)據(jù)
  • iat:通過(guò)行和列的下標(biāo)來(lái)訪(fǎng)問(wèn)數(shù)據(jù)
# select_data.py

print("series1.at['E']={}\n".format(series1.at['E']));
print("df1.iloc[4,1]={}\n".format(df1.iloc[4,1]))

這兩行代碼輸出如下:

series1.at['E']=3

df1.iloc[4,1]=Fri

Index對(duì)象

在入門(mén)教程我們也已經(jīng)簡(jiǎn)單介紹過(guò)Index,Index提供了查找,數(shù)據(jù)對(duì)齊和重新索引所需的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。

最直接的,我們可以通過(guò)一個(gè)數(shù)組來(lái)創(chuàng)建Index對(duì)象。在創(chuàng)建的同時(shí)我們還可以通過(guò)name指定索引的名稱(chēng):

# index.py

index = pd.Index(['C','D','E','F','G','A','B'], name='note')

Index類(lèi)提供了很多的方法進(jìn)行各種操作,這個(gè)建議讀者直接查詢(xún)API說(shuō)明即可,這里不多做說(shuō)明。稍微提一下的是,Index對(duì)象可以互相之間做集合操作,例如:

# index.py

a = pd.Index([1,2,3,4,5])
b = pd.Index([3,4,5,6,7])

print("a|b = {}\n".format(a|b))
print("a&b = {}\n".format(a&b))
print("a.difference(b) = {}\n".format(a.difference(b)))

這幾個(gè)運(yùn)算的結(jié)果如下:

a|b = Int64Index([1, 2, 3, 4, 5, 6, 7], dtype='int64')

a&b = Int64Index([3, 4, 5], dtype='int64')

a.difference(b) = Int64Index([1, 2], dtype='int64')

Index類(lèi)有很多的子類(lèi),下面是最常見(jiàn)的一些:

MultiIndex

MultiIndex,或者稱(chēng)之為Hierarchical Index是指數(shù)據(jù)的行或者列通過(guò)多層次的標(biāo)簽來(lái)進(jìn)行索引。

例如,我們要通過(guò)一個(gè)MultiIndex描述三個(gè)公司在三年內(nèi)每個(gè)季度的營(yíng)業(yè)額,可以這樣:

# multiindex.py

import pandas as pd
import numpy as np

multiIndex = pd.MultiIndex.from_arrays([
 ['Geagle', 'Geagle', 'Geagle', 'Geagle',
  'Epple', 'Epple', 'Epple', 'Epple', 'Macrosoft',
  'Macrosoft', 'Macrosoft', 'Macrosoft', ],
 ['S1', 'S2', 'S3', 'S4', 'S1', 'S2', 'S3', 'S4', 'S1', 'S2', 'S3', 'S4']],
 names=('Company', 'Turnover'))

這段代碼輸出如下:

multiIndex =
MultiIndex(levels=[['Epple', 'Geagle', 'Macrosoft'], ['S1', 'S2', 'S3', 'S4']],
           labels=[[1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]],
           names=['Company', 'Turnover'])

從這個(gè)輸出可以看出,MultiIndex中的levels數(shù)組數(shù)量對(duì)應(yīng)了索引的級(jí)別數(shù)量,labels對(duì)應(yīng)了levels中元素的下標(biāo)。

下面我們用一個(gè)隨機(jī)數(shù)來(lái)構(gòu)造一個(gè)DataFrame:

# multiindex.py

df = pd.DataFrame(data=np.random.randint(0, 1000, 36).reshape(-1, 12),
     index=[2016, 2017, 2018],
     columns=multiIndex)
print("df = \n{}\n".format(df))

這里創(chuàng)建出了36個(gè)[0, 1000)之間的隨機(jī)數(shù),然后組裝成3行12列的矩陣(如果你對(duì)NumPy不熟悉可以訪(fǎng)問(wèn)NumPy官網(wǎng)學(xué)習(xí),或者看一下我之前寫(xiě)過(guò)的:Python 機(jī)器學(xué)習(xí)庫(kù) NumPy 教程)。

上面這段代碼輸出如下:

df =
Company  Geagle                Epple                Macrosoft              
Turnover     S1   S2   S3   S4    S1   S2   S3   S4        S1   S2   S3   S4
2016        329   25  553  852   833  710  247  990       215  991  535  846
2017        734  368   28  161   187  444  901  858       244  915  261  485
2018        769  707  458  782   948  169  927  237       279  438  738  708

這個(gè)輸出很直觀的可以看出三個(gè)公司在三年內(nèi)每個(gè)季度的營(yíng)業(yè)額。

有了多級(jí)索引,我們可以方便的進(jìn)行數(shù)據(jù)的篩選,例如:

  • 通過(guò)df.loc[2017, (['Geagle', 'Epple', 'Macrosoft'] ,'S1')])篩選出三個(gè)公司2017年第一季度的營(yíng)業(yè)額
  • 通過(guò)df.loc[2018, 'Geagle']篩選出Geagle公司2018年每個(gè)季度的營(yíng)業(yè)額

它們輸出如下:

2017 S1:
Company    Turnover
Geagle     S1          734
Epple      S1          187
Macrosoft  S1          244
Name: 2017, dtype: int64

Geagle 2018:
Turnover
S1    769
S2    707
S3    458
S4    782
Name: 2018, dtype: int64

數(shù)據(jù)整合

Concat:串聯(lián),連接,級(jí)連
Append:附加,增補(bǔ)
Merge:融合,歸并,合并
Join:合并,接合,交接

Concat與Append

concat函數(shù)的作用是將多個(gè)數(shù)據(jù)串聯(lián)到一起。例如,某個(gè)多條數(shù)據(jù)分散在3個(gè)地方記錄,最后我們將三個(gè)數(shù)據(jù)添加到一起。下面是一個(gè)代碼示例:

# concat_append.py

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Note': ['C', 'D'],
     'Weekday': ['Mon', 'Tue']},
     index=[1, 2])

df2 = pd.DataFrame({'Note': ['E', 'F'],
     'Weekday': ['Wed', 'Thu']},
     index=[3, 4])

df3 = pd.DataFrame({'Note': ['G', 'A', 'B'],
     'Weekday': ['Fri', 'Sat', 'Sun']},
     index=[5, 6, 7])

df_concat = pd.concat([df1, df2, df3], keys=['df1', 'df2', 'df3'])
print("df_concat=\n{}\n".format(df_concat))

這里我們通過(guò)keys指定了三個(gè)數(shù)據(jù)的索引劃分,最后的數(shù)據(jù)中會(huì)由此存在MultiIndex。這段代碼輸出如下:

df_concat=
      Note Weekday
df1 1    C     Mon
    2    D     Tue
df2 3    E     Wed
    4    F     Thu
df3 5    G     Fri
    6    A     Sat
    7    B     Sun

請(qǐng)仔細(xì)思考一下df_concat結(jié)構(gòu)與原先三個(gè)數(shù)據(jù)結(jié)構(gòu)的關(guān)系:其實(shí)它就是將原先三個(gè)數(shù)據(jù)縱向串聯(lián)起來(lái)了。另外,請(qǐng)關(guān)注一下MultiIndex結(jié)構(gòu)。

concat函數(shù)默認(rèn)是以axis=0(行)為主進(jìn)行串聯(lián)。如果需要,我們可以指定axis=1(列)為主進(jìn)行串聯(lián):

# concat_append.py

df_concat_column = pd.concat([df1, df2, df3], axis=1)
print("df_concat_column=\n{}\n".format(df_concat_column))

這個(gè)結(jié)構(gòu)輸出如下:

df_concat_column=
  Note Weekday Note Weekday Note Weekday
1    C     Mon  NaN     NaN  NaN     NaN
2    D     Tue  NaN     NaN  NaN     NaN
3  NaN     NaN    E     Wed  NaN     NaN
4  NaN     NaN    F     Thu  NaN     NaN
5  NaN     NaN  NaN     NaN    G     Fri
6  NaN     NaN  NaN     NaN    A     Sat
7  NaN     NaN  NaN     NaN    B     Sun

請(qǐng)?jiān)俅斡^察一下這里的結(jié)果和原先三個(gè)數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系。

concat是將多個(gè)數(shù)據(jù)串聯(lián)在一起。類(lèi)似的,對(duì)于某個(gè)具體的數(shù)據(jù)來(lái)說(shuō),我們可以在其數(shù)據(jù)基礎(chǔ)上添加(append)其他數(shù)據(jù)來(lái)進(jìn)行串聯(lián):

# concat_append.py

df_append = df1.append([df2, df3])
print("df_append=\n{}\n".format(df_append))

這個(gè)操作的結(jié)果和之前的concat是一樣的:

df_append=
  Note Weekday
1    C     Mon
2    D     Tue
3    E     Wed
4    F     Thu
5    G     Fri
6    A     Sat
7    B     Sun

Merge與Join

pandas中的Merge操作和SQL語(yǔ)句中的Join操作是類(lèi)似的。Join操作可以分為下面幾種:

  • INNER
  • LEFT OUTER
  • RIGHT OUTER
  • FULL OUTER
  • CROSS

關(guān)于這幾種的Join操作的含義請(qǐng)參閱其他資料,例如維基百科:Join 。

使用pandas進(jìn)行Merge操作很簡(jiǎn)單,下面是一段代碼示例:

# merge_join.py

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'key': ['K1', 'K2', 'K3', 'K4'],
     'A': ['A1', 'A2', 'A3', 'A8'],
     'B': ['B1', 'B2', 'B3', 'B8']})

df2 = pd.DataFrame({'key': ['K3', 'K4', 'K5', 'K6'],
     'A': ['A3', 'A4', 'A5', 'A6'],
     'B': ['B3', 'B4', 'B5', 'B6']})

print("df1=\n{}\n".format(df1))
print("df2=\n{}\n".format(df2))

merge_df = pd.merge(df1, df2)
merge_inner = pd.merge(df1, df2, how='inner', on=['key'])
merge_left = pd.merge(df1, df2, how='left')
merge_left_on_key = pd.merge(df1, df2, how='left', on=['key'])
merge_right_on_key = pd.merge(df1, df2, how='right', on=['key'])
merge_outer = pd.merge(df1, df2, how='outer', on=['key'])

print("merge_df=\n{}\n".format(merge_df))
print("merge_inner=\n{}\n".format(merge_inner))
print("merge_left=\n{}\n".format(merge_left))
print("merge_left_on_key=\n{}\n".format(merge_left_on_key))
print("merge_right_on_key=\n{}\n".format(merge_right_on_key))
print("merge_outer=\n{}\n".format(merge_outer))

這段代碼說(shuō)明如下:

  • merge函數(shù)的join參數(shù)的默認(rèn)值是“inner”,因此merge_df是兩個(gè)數(shù)據(jù)的inner join的結(jié)果。另外,在不指明的情況下,merge函數(shù)使用所有同名的列名作為key來(lái)進(jìn)行運(yùn)算。
  • merge_inner是指定了列的名稱(chēng)進(jìn)行inner join。
  • merge_left是left outer join的結(jié)果
  • merge_left_on_key是指定了列名進(jìn)行l(wèi)eft outer join的結(jié)果
  • merge_right_on_key是指定了列名進(jìn)行right outer join的結(jié)果
  • merge_outer是full outer join的結(jié)果

這里的結(jié)果如下,請(qǐng)觀察一下結(jié)果與你的預(yù)算是否一致:

df1=
    A   B key
0  A1  B1  K1
1  A2  B2  K2
2  A3  B3  K3
3  A8  B8  K4

df2=
    A   B key
0  A3  B3  K3
1  A4  B4  K4
2  A5  B5  K5
3  A6  B6  K6

merge_df=
    A   B key
0  A3  B3  K3

merge_inner=
  A_x B_x key A_y B_y
0  A3  B3  K3  A3  B3
1  A8  B8  K4  A4  B4

merge_left=
    A   B key
0  A1  B1  K1
1  A2  B2  K2
2  A3  B3  K3
3  A8  B8  K4

merge_left_on_key=
  A_x B_x key  A_y  B_y
0  A1  B1  K1  NaN  NaN
1  A2  B2  K2  NaN  NaN
2  A3  B3  K3   A3   B3
3  A8  B8  K4   A4   B4

merge_right_on_key=
   A_x  B_x key A_y B_y
0   A3   B3  K3  A3  B3
1   A8   B8  K4  A4  B4
2  NaN  NaN  K5  A5  B5
3  NaN  NaN  K6  A6  B6

merge_outer=
   A_x  B_x key  A_y  B_y
0   A1   B1  K1  NaN  NaN
1   A2   B2  K2  NaN  NaN
2   A3   B3  K3   A3   B3
3   A8   B8  K4   A4   B4
4  NaN  NaN  K5   A5   B5
5  NaN  NaN  K6   A6   B6

DataFrame也提供了join函數(shù)來(lái)根據(jù)索引進(jìn)行數(shù)據(jù)合并。它可以被用于合并多個(gè)DataFrame,這些DataFrame有相同的或者類(lèi)似的索引,但是沒(méi)有重復(fù)的列名。默認(rèn)情況下,join函數(shù)執(zhí)行l(wèi)eft join。另外,假設(shè)兩個(gè)數(shù)據(jù)有相同的列名,我們可以通過(guò)lsuffixrsuffix來(lái)指定結(jié)果中列名的前綴。下面是一段代碼示例:

# merge_join.py

df3 = pd.DataFrame({'key': ['K1', 'K2', 'K3', 'K4'],
     'A': ['A1', 'A2', 'A3', 'A8'],
     'B': ['B1', 'B2', 'B3', 'B8']},
     index=[0, 1, 2, 3])

df4 = pd.DataFrame({'key': ['K3', 'K4', 'K5', 'K6'],
     'C': ['A3', 'A4', 'A5', 'A6'],
     'D': ['B3', 'B4', 'B5', 'B6']},
     index=[1, 2, 3, 4])

print("df3=\n{}\n".format(df3))
print("df4=\n{}\n".format(df4))

join_df = df3.join(df4, lsuffix='_self', rsuffix='_other')
join_left = df3.join(df4, how='left', lsuffix='_self', rsuffix='_other')
join_right = df1.join(df4, how='outer', lsuffix='_self', rsuffix='_other')

print("join_df=\n{}\n".format(join_df))
print("join_left=\n{}\n".format(join_left))
print("join_right=\n{}\n".format(join_right))

這段代碼輸出如下:

df3=
    A   B key
0  A1  B1  K1
1  A2  B2  K2
2  A3  B3  K3
3  A8  B8  K4

df4=
    C   D key
1  A3  B3  K3
2  A4  B4  K4
3  A5  B5  K5
4  A6  B6  K6

join_df=
    A   B key_self    C    D key_other
0  A1  B1       K1  NaN  NaN       NaN
1  A2  B2       K2   A3   B3        K3
2  A3  B3       K3   A4   B4        K4
3  A8  B8       K4   A5   B5        K5

join_left=
    A   B key_self    C    D key_other
0  A1  B1       K1  NaN  NaN       NaN
1  A2  B2       K2   A3   B3        K3
2  A3  B3       K3   A4   B4        K4
3  A8  B8       K4   A5   B5        K5

join_right=
     A    B key_self    C    D key_other
0   A1   B1       K1  NaN  NaN       NaN
1   A2   B2       K2   A3   B3        K3
2   A3   B3       K3   A4   B4        K4
3   A8   B8       K4   A5   B5        K5
4  NaN  NaN      NaN   A6   B6        K6

數(shù)據(jù)集合和分組操作

很多時(shí)候,我們會(huì)需要對(duì)批量的數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)或者再處理,groupby,agg,apply就是用來(lái)做這件事的。

  • groupby將數(shù)據(jù)分組,分組后得到pandas.core.groupby.DataFrameGroupBy類(lèi)型的數(shù)據(jù)。
  • agg用來(lái)進(jìn)行合計(jì)操作,agg是aggregate的別名。
  • apply用來(lái)將函數(shù)func分組化并將結(jié)果組合在一起。

這些概念都很抽象,我們還是通過(guò)代碼來(lái)進(jìn)行說(shuō)明。

# groupby.py

import pandas as pd
import numpy as np

df = pd.DataFrame({
 'Name': ['A','A','A','B','B','B','C','C','C'],
 'Data': np.random.randint(0, 100, 9)})
print('df=\n{}\n'.format(df))

groupby = df.groupby('Name')

print("Print GroupBy:")
for name, group in groupby:
 print("Name: {}\nGroup:\n{}\n".format(name, group))

在這段代碼中,我們生成了9個(gè)[0, 100)之間的隨機(jī)數(shù),數(shù)據(jù)的第一列是['A','A','A','B','B','B','C','C','C']。然后我們以Name列進(jìn)行groupby,得到的結(jié)果會(huì)根據(jù)將Name列值一樣的分組在一起,我們將得到的結(jié)果進(jìn)行了打印。這段代碼的輸出如下:

df=
   Data Name
0    34    A
1    44    A
2    57    A
3    81    B
4    78    B
5    65    B
6    73    C
7    16    C
8     1    C

Print GroupBy:
Name: A
Group:
   Data Name
0    34    A
1    44    A
2    57    A

Name: B
Group:
   Data Name
3    81    B
4    78    B
5    65    B

Name: C
Group:
   Data Name
6    73    C
7    16    C
8     1    C

groupby并不是我們的最終目的,我們的目的是希望分組后還要對(duì)這些數(shù)據(jù)進(jìn)行進(jìn)一步的統(tǒng)計(jì)或者處理。pandas庫(kù)本身就提供了很多進(jìn)行操作的函數(shù),例如:countsum,mean,medianstd,var,minmax,prodfirst,last。這些函數(shù)的名稱(chēng)很容易明白它的作用。

例如:groupby.sum()就是對(duì)結(jié)果進(jìn)行求和運(yùn)行。

除了直接調(diào)用這些函數(shù)之外,我們也可以通過(guò)agg函數(shù)來(lái)達(dá)到這個(gè)目的,這個(gè)函數(shù)接收其他函數(shù)的名稱(chēng),例如這樣:groupby.agg(['sum'])。

通過(guò)agg函數(shù),可以一次性調(diào)用多個(gè)函數(shù),并且可以為結(jié)果列指定名稱(chēng)。

像這樣:groupby.agg([('Total', 'sum'), ('Min', 'min')])。

這里的三個(gè)調(diào)用輸出結(jié)果如下:

# groupby.py

Sum: 
  Data
Name  
A  135
B  224
C  90

Agg Sum: 
  Data
  sum
Name  
A  135
B  224
C  90

Agg Map: 
  Data 
  Total Min
Name   
A  135 34
B  224 65
C  90 1

除了對(duì)數(shù)據(jù)集合進(jìn)行統(tǒng)計(jì),我們也可以通過(guò)apply函數(shù)進(jìn)行分組數(shù)據(jù)的處理。像這樣:

# groupby.py

def sort(df):
 return df.sort_values(by='Data', ascending=False)

print("Sort Group: \n{}\n".format(groupby.apply(sort)))

在這段代碼中,我們定義了一個(gè)排序函數(shù),并應(yīng)用在分組數(shù)據(jù)上,這里最終的輸出如下:

Sort Group:
        Data
Name       
A    2    57
     1    44
     0    34
B    3    81
     4    78
     5    65
C    6    73
     7    16
     8     1

時(shí)間相關(guān)

時(shí)間是應(yīng)用程序中很頻繁需要處理的邏輯,尤其是對(duì)于金融,科技,商業(yè)等領(lǐng)域。

當(dāng)我們?cè)谟懻摃r(shí)間,我們討論的可能是下面三種情況中的一種:

  • 某個(gè)具體的時(shí)間點(diǎn)(Timestamp),例如:今天下午一點(diǎn)整
  • 某個(gè)時(shí)間范圍(Period),例如:整個(gè)這個(gè)月
  • 某個(gè)時(shí)間間隔(Interval),例如:每周二上午七點(diǎn)整

Python語(yǔ)言提供了時(shí)間日期相關(guān)的基本API,它們位于datetime, time, calendar幾個(gè)模塊中。下面是一個(gè)代碼示例:

# time.py

import datetime as dt
import numpy as np
import pandas as pd

now = dt.datetime.now();
print("Now is {}".format(now))

yesterday = now - dt.timedelta(1);
print("Yesterday is {}\n".format(yesterday.strftime('%Y-%m-%d')))

在這段代碼中,我們打印了今天的日期,并通過(guò)timedelta進(jìn)行了日期的減法運(yùn)算。這段代碼輸出如下:

借助pandas提供的接口,我們可以很方便的獲得以某個(gè)時(shí)間間隔的時(shí)間序列,例如這樣:

# time.py

this_year = pd.date_range(dt.datetime(2018, 1, 1),
  dt.datetime(2018, 12, 31), freq='5D')
print("Selected days in 2018: \n{}\n".format(this_year))

這段代碼獲取了整個(gè)2018年中從元旦開(kāi)始,每隔5天的日期序列。

date_range函數(shù)的詳細(xì)說(shuō)明見(jiàn)這里:pandas.date_range

這段代碼的輸出如下:

Selected days in 2018:
DatetimeIndex(['2018-01-01', '2018-01-06', '2018-01-11', '2018-01-16',
               '2018-01-21', '2018-01-26', '2018-01-31', '2018-02-05',
               '2018-02-10', '2018-02-15', '2018-02-20', '2018-02-25',
               '2018-03-02', '2018-03-07', '2018-03-12', '2018-03-17',
               '2018-03-22', '2018-03-27', '2018-04-01', '2018-04-06',
               '2018-04-11', '2018-04-16', '2018-04-21', '2018-04-26',
               '2018-05-01', '2018-05-06', '2018-05-11', '2018-05-16',
               '2018-05-21', '2018-05-26', '2018-05-31', '2018-06-05',
               '2018-06-10', '2018-06-15', '2018-06-20', '2018-06-25',
               '2018-06-30', '2018-07-05', '2018-07-10', '2018-07-15',
               '2018-07-20', '2018-07-25', '2018-07-30', '2018-08-04',
               '2018-08-09', '2018-08-14', '2018-08-19', '2018-08-24',
               '2018-08-29', '2018-09-03', '2018-09-08', '2018-09-13',
               '2018-09-18', '2018-09-23', '2018-09-28', '2018-10-03',
               '2018-10-08', '2018-10-13', '2018-10-18', '2018-10-23',
               '2018-10-28', '2018-11-02', '2018-11-07', '2018-11-12',
               '2018-11-17', '2018-11-22', '2018-11-27', '2018-12-02',
               '2018-12-07', '2018-12-12', '2018-12-17', '2018-12-22',
               '2018-12-27'],
              dtype='datetime64[ns]', freq='5D')

我們得到的返回值是DatetimeIndex類(lèi)型的,我們可以創(chuàng)建一個(gè)DataFrame并以此作為索引:

# time.py

df = pd.DataFrame(np.random.randint(0, 100, this_year.size), index=this_year)
print("Jan: \n{}\n".format(df['2018-01']))

在這段代碼中,我們創(chuàng)建了與索引數(shù)量一樣多的[0, 100)間的隨機(jī)整數(shù),并用this_year作為索引。用DatetimeIndex作索引的好處是,我們可以直接指定某個(gè)范圍來(lái)選擇數(shù)據(jù),例如,通過(guò)df['2018-01']選出所有1月份的數(shù)據(jù)。

這段代碼輸出如下:

圖形展示

pandas的圖形展示依賴(lài)于matplotlib庫(kù)。對(duì)于這個(gè)庫(kù),我們?cè)诤竺鏁?huì)專(zhuān)門(mén)講解,因?yàn)檫@里僅僅提供一個(gè)簡(jiǎn)單的代碼示例,讓大家感受一下圖形展示的樣子。

代碼示例如下:

# plot.py

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv("data/housing.csv")
data.hist(bins=50, figsize=(15, 12))
plt.show()

這段代碼讀取了一個(gè)CSV文件,這個(gè)文件中包含了一些關(guān)于房?jī)r(jià)的信息。在讀取完之后,通過(guò)直方圖(hist)將其展示了出來(lái)。

該CSV文件的內(nèi)容見(jiàn)這里:pandas_tutorial/data/housing.csv

直方圖結(jié)果如下所示:

結(jié)束語(yǔ)

雖然本文的標(biāo)題是“進(jìn)階篇”,我們也討論了一些更深入的知識(shí)。但很顯然,這對(duì)于pandas來(lái)說(shuō),仍然是很皮毛的東西。由于篇幅所限,更多的內(nèi)容在今后的時(shí)候,有機(jī)會(huì)我們?cè)賮?lái)一起探討。

讀者朋友也可以根據(jù)官網(wǎng)上的文檔進(jìn)行更深入的學(xué)習(xí)。

參考資料與推薦讀物

相關(guān)文章

  • Python生成rsa密鑰對(duì)操作示例

    Python生成rsa密鑰對(duì)操作示例

    這篇文章主要介紹了Python生成rsa密鑰對(duì)操作,涉及Python rsa加密與密鑰生成相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Python使用XPath解析HTML的方法詳解

    Python使用XPath解析HTML的方法詳解

    XPath是一種用于選擇XML文檔中節(jié)點(diǎn)的語(yǔ)言,它可以通過(guò)路徑表達(dá)式來(lái)定位節(jié)點(diǎn)。本文將介紹Python中使用XPath解析HTML文檔的方法和技巧,需要的可以參考下
    2023-05-05
  • PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例

    PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例

    我們?cè)谶M(jìn)行圖像處理時(shí),經(jīng)常會(huì)用到讀取圖片并顯示出來(lái)這樣的操作,下面這篇文章主要給大家介紹了關(guān)于PyQt5簡(jiǎn)單讀取以及顯示圖片應(yīng)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • python計(jì)算最大優(yōu)先級(jí)隊(duì)列實(shí)例

    python計(jì)算最大優(yōu)先級(jí)隊(duì)列實(shí)例

    python計(jì)算最大優(yōu)先級(jí)隊(duì)列實(shí)例,大家參考使用吧
    2013-12-12
  • Python熱重載調(diào)試新利器問(wèn)題解決

    Python熱重載調(diào)試新利器問(wèn)題解決

    Reloading是一個(gè)Python工具庫(kù),它讓我們可以在每次迭代之前從源代碼中重新加載(或函數(shù))而不丟失任何當(dāng)前已執(zhí)行過(guò)程,這篇文章主要介紹了Python熱重載調(diào)試新利器,需要的朋友可以參考下
    2024-06-06
  • 9個(gè)提高?Python?編程的小技巧

    9個(gè)提高?Python?編程的小技巧

    這篇文章主要介紹了9個(gè)提高?Python?編程的小技巧,下文分享python編程技巧,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-05-05
  • python獲取list下標(biāo)及其值的簡(jiǎn)單方法

    python獲取list下標(biāo)及其值的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇python獲取list下標(biāo)及其值的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Python實(shí)現(xiàn)常見(jiàn)的幾種加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    Python實(shí)現(xiàn)常見(jiàn)的幾種加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    這篇文章主要介紹了Python實(shí)現(xiàn)常見(jiàn)的幾種加密算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 使用Pandas?實(shí)現(xiàn)MySQL日期函數(shù)的解決方法

    使用Pandas?實(shí)現(xiàn)MySQL日期函數(shù)的解決方法

    這篇文章主要介紹了用Pandas?實(shí)現(xiàn)MySQL日期函數(shù)的效果,Python是很靈活的語(yǔ)言,達(dá)成同一個(gè)目標(biāo)或有多種途徑,我提供的只是其中一種解決方法,需要的朋友可以參考下
    2023-02-02
  • Python實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的方法分享

    Python實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的方法分享

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的功能,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Python有一定的幫助,需要的可以參考一下
    2023-01-01

最新評(píng)論

辽源市| 曲靖市| 平远县| 鲜城| 光泽县| 南漳县| 新竹县| 宿松县| 无锡市| 曲麻莱县| 建始县| 封丘县| 冷水江市| 兴文县| 湖北省| 德清县| 刚察县| 仲巴县| 德州市| 揭西县| 华阴市| 崇州市| 东阳市| 宁夏| 巫山县| 无为县| 湟中县| 延吉市| 敖汉旗| 梁河县| 义乌市| 安康市| 开阳县| 奈曼旗| 巴南区| 大兴区| 尉氏县| 同仁县| 舟山市| 平阴县| 香格里拉县|