<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【DS with Python】DataFrame的合并、分組聚合與數(shù)據(jù)透視表

          共 23611字,需瀏覽 48分鐘

           ·

          2022-01-03 02:53

          本節(jié)主要介紹數(shù)據(jù)處理過程中Pandas的常見模塊與DataFrame的常見處理方法,建議參數(shù)問題可以查查在API reference中有各個功能的詳細參數(shù)與具體介紹

          一、DataFrame的合并

          1.1 按列名合并 (pd.merge())

          如果需要將兩個DataFrame合并,我們可以用pandas中的merge功能

          pd.merge(df1,df2,how='inner',on=None,left_index=False,right_index=False,left_on=None,right_on=None,suffixes=('_x', '_y'))

          • 常用的參數(shù):df1df2是兩個DataFrame,how是連接方式,on是按哪一列進行合并,也可以傳入一個list,用Multi-index來合并,如果需要合并的列在兩張表名字不同,可以用left_onright_on參數(shù),如果想用index來合并,可以選擇left_index=True或者right_index=True。如果兩張表中的列名是一樣的,新表中來自df1的列名會自動在最后添加'_x',來自df2的列名會自動在最后添加'_y',可以在suffixes中修改。
          • 如何合并?假設(shè)我們有兩個DataFrame,分別是學生students和職工staff,那我們有幾種合并方式? ??假設(shè)我們以Students為df1,staff為df2 ??(注意:此處P2包含了Student的數(shù)據(jù)和Staff的數(shù)據(jù),直白來說P1+P2不等于Student) ??1.只要交集部分P2,可以用內(nèi)連接,how='inner' ??2.要整個圖形P1+P2+P3, 可以用外連接,how='outer' ??3.只要包含所有學生部分P1+P2,可以用左連接,how='left' ??4.只要包含所有職工部分P2+P3,可以用右連接,how='right'

          例如,在學校中有的人既是老師,有是職工,我們想要得到所有的人員名單,可以用outer模式來合并,空值會用NaN代替:

          import pandas as pd 
          import numpy as np

          staff_df=pd.DataFrame([{<!-- -->'Name':'Kelly','Role':'Director of HR'},
                                {<!-- -->'Name':'Mike','Role':'Course Liasion'},
                                {<!-- -->'Name':'Sally','Role':'Grader'},])
          staff_df=staff_df.set_index('Name')
          student_df = pd.DataFrame([{<!-- -->'Name':'James','School':'Business'},
                                {<!-- -->'Name':'Mike','School':'Law'},
                                {<!-- -->'Name':'Sally','School':'Engineering'}])
          student_df=student_df.set_index('Name')

          df1=pd.merge(staff_df,student_df,how='outer',left_index=True,right_index=True)
          df1

          ??如果我們想要查看所有學生,并看看他們是否有教職,那就把student_df看作df1并用inner連接

          df1=pd.merge(staff_df,student_df,how='inner',left_index=True,right_index=True)
          df1

          ??如果學生有姓和名,可以用list來做on的參數(shù)連接

          staff_df = pd.DataFrame([{<!-- -->'First Name''Kelly''Last Name''Desjardins'
                                    'Role''Director of HR'},
                                   {<!-- -->'First Name''Sally''Last Name''Brooks'
                                    'Role''Course liasion'},
                                   {<!-- -->'First Name''James''Last Name''Wilde'
                                    'Role''Grader'}])
          student_df = pd.DataFrame([{<!-- -->'First Name''James''Last Name''Hammond'
                                      'School''Business'},
                                     {<!-- -->'First Name''Mike''Last Name''Smith'
                                      'School''Law'},
                                     {<!-- -->'First Name''Sally''Last Name''Brooks'
                                      'School''Engineering'}])
                                      
          pd.merge(staff_df, student_df, how='inner', on=['First Name','Last Name'])

          ??如果有兩列的名字是相同的,df1的列名會添加_x,df2則添加_y,當然也可以在suffixes參數(shù)中調(diào)整例如suffixes=('_a','_b')

          staff_df = pd.DataFrame([{<!-- -->'Name''Kelly''Role''Director of HR'
                                    'Location''State Street'},
                                   {<!-- -->'Name''Sally''Role''Course liasion'
                                    'Location''Washington Avenue'},
                                   {<!-- -->'Name''James''Role''Grader'
                                    'Location''Washington Avenue'}])
          student_df = pd.DataFrame([{<!-- -->'Name''James''School''Business'
                                      'Location''1024 Billiard Avenue'},
                                     {<!-- -->'Name''Mike''School''Law'
                                      'Location''Fraternity House #22'},
                                     {<!-- -->'Name''Sally''School''Engineering'
                                      'Location''512 Wilson Crescent'}])
          pd.merge(staff_df, student_df, how='left', on='Name',suffixes=('_a','_b'))

          1.2 相同列添加行數(shù) (pd.concat()功能)

          例如,我們將同一個指標的2011年、2012年和2013年的數(shù)據(jù)合并到一張表中,可以用pd.concat()功能,如下:

          frames = [df_2011, df_2012, df_2013]
          df=pd.concat(frames)
          print(len(df_2011)+len(df_2012)+len(df_2013))
          df

          二、應(yīng)用 (.apply()功能)

          DataFrame和Series都可以應(yīng)用.apply()功能,語法為:df.apply() Series.apply() ,在apply中的參數(shù)主要是函數(shù),可以是def定義函數(shù),也可以是lambda函數(shù)。為了用好apply()功能,需要了解以下問題:

          • apply()傳入?yún)?shù)到底是什么?對于Series使用apply()功能是將Series中的每一個元素作為傳入?yún)?shù)放入apply中的函數(shù)中,返回單值。??而對DataFrame使用apply()功能,是將DataFrame中的每一個Series作為傳入?yún)?shù)放入apply中的函數(shù)中,返回Series。

          注意:前面我們講到,DataFrame中的row和columns實際上只是名字不同而已,在DataFrame中的格式和地位都是一樣的,所以DataFrame可以傳入每一行的Series(對列進行apply,利用apply()功能中的參數(shù)axis=1)也可以傳入每一列的Series(對行進行apply,利用axis=0,這個是默認值,即如果不加axis參數(shù),apply()功能會將按列傳入Series),用兩個例子來說明:

          import pandas as pd
          import numpy as np
          dic={<!-- -->'a':[5,6,7],'b':[6,7,8],'c':[8,9,0]}
          df=pd.DataFrame(dic)
          print(df)
          f = lambda x: x.max() + x.min()
          def show_series(row):
              print(row)
          print(df.apply(f,axis=1))
          print(df.apply(f,axis=0))

          df.apply(show_series)

          • apply與dict我們知道python的def設(shè)計函數(shù)的時候可以設(shè)定默認參數(shù),參數(shù)中有args=()和**kwarge,前者表示可以傳入tuple,后者表示可以傳入dict,那么我們在設(shè)計的時候,利用這一特性,傳入字典,這可以幫我們進一步了解apply()的使用,例如我們要設(shè)置少數(shù)民族加分政策,漢族加0分,回族加10分,藏族加5分(不代表現(xiàn)實生活中真實數(shù)據(jù)):
          data=[{<!-- -->'Name':'張','Nationality':'漢','Score':400},
               {<!-- -->'Name':'李','Nationality':'回','Score':450},
               {<!-- -->'Name':'王','Nationality':'漢','Score':460}]
          df=pd.DataFrame(data)
          def add_extra2(nationality,**kwargs):
              return kwargs[nationality]
          df['extra']=df.Nationality.apply(add_extra2,漢=0,回=10,藏=5)
          df

          ??在這里,我們給a的屬性是一個dict,對于DataFrame的Nationality列進行apply,傳入的就是每一個Nationality的元素,查詢字典kwargs中對應(yīng)的值并返回一個單值,傳給df[‘extra’]。

          三、分組 (.groupby())

          3.1 groupby的原理與返回值

          Pandas模塊中.groupby() 功能背后的思想是,它獲取一些DataFrame,根據(jù)一些鍵值將其拆分(split)為塊,對這些塊應(yīng)用(apply)計算,然后將結(jié)果合并(combine)回另一個DataFrame。在pandas中,這稱為“split-apply-combine”模式,其語法為:

          df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

          .groupby()返回的是一個tuple,其中第一個值是用于分類的key值,通常記作group,第二個值是當前key值所對應(yīng)的DataFrame,通常記作frame。本質(zhì)上.group()和迭代器計算是很像的,例如以下兩段代碼,所實現(xiàn)的功能是一樣的,但是.groupby()在計算效率上比普通的迭代器要快上不少:

          %%timeit -n 3
          for group, frame in df.groupby('STNAME'):
              avg = np.average(frame['CENSUS2010POP'])
              # And print the results
              print('Counties in state ' + group + 
                    ' have an average population of ' + str(avg))

          %%timeit -n 3

          for state in df['STNAME'].unique():
              avg = np.average(df.where(df['STNAME']==state).dropna()['CENSUS2010POP'])
              print('Counties in state ' + state + 
                    ' have an average population of ' + str(avg))

          接下來通過介紹主要分組依據(jù)用到的參數(shù)by,就可以對groupby()有良好的理解

          • 在by中設(shè)定規(guī)則,你可以傳入列名,函數(shù),list,dict或者Series首先,最常規(guī)的就是像上面的例子中用DataFrame的列名。

          第二是用函數(shù),要注意,在調(diào)用函數(shù)的時候,傳入函數(shù)中的數(shù)據(jù)是DataFrame的index,所以要確保之前已經(jīng)用set_index()功能實現(xiàn)了對index的設(shè)置,例如,我們要根據(jù)美國的某個州的第一個字母來分組,如果第一個字母為[A-L]則返回0,為[M-P]返回1,其他則返回2:

          df = df.set_index('STNAME')

          def set_batch_number(item):
              if item[0]&lt;'M':
                  return 0
              if item[0]&lt;'Q':
                  return 1
              return 2

          for group, frame in df.groupby(set_batch_number):
              print('There are ' + str(len(frame)) + ' records in group ' + str(group) + ' for processing.')

          ??第三是用list,這用于多重分類的時候,比如我們要按某商品的‘cancellation_policy’和‘review_scores_value’進行分類,可以用如下方法查看分類的依據(jù):

          df=pd.read_csv("datasets/listings.csv")
          dicts=["cancellation_policy","review_scores_value"]
          for group, frame in df.groupby(dicts):
              print(group)

          ??如果DataFrame是有多重index的,我們可以直接用多重index進行分組,這時需要添加level參數(shù),level參數(shù)用于確認index在groupby中的先后順序

          import pandas as pd
          df=pd.read_csv("datasets/listings.csv")
          df=df.set_index(["cancellation_policy","review_scores_value"])

          for group, frame in df.groupby(level=(0,1)):
              print(group)

          ??第四,用Series或者Dict,他和list是很像的,但這往往是對列進行分組,即需要添加axis=1,分組時key值是按分組分組,在分組后會將組名改為key值對應(yīng)的value值

          df=pd.read_csv("datasets/listings.csv")
          dicts={<!-- -->"cancellation_policy":1,"review_scores_value":2}
          for group, frame in df.groupby(dicts,axis=1):
              print(group,frame)

          3.2 分組后數(shù)據(jù)聚合 (.agg())

          agg的語法為:df.groupby()['列名'].agg({'列名':(函數(shù),函數(shù))}) ??或者 df.groupby()['列名'].agg([函數(shù),函數(shù)]) ??注:列名可以緊跟在groupby()后,也可以在agg()內(nèi)用dict來表示

          在將DataFrame分組后,我們可以對分組后的值進行計算,主要包括以下幾種:

          |函數(shù)|作用 |------ |np.min|求最小值 |np.max|求最大值 |np.sum|求和 |np.mean|求評價值 |np.meadian|求中值 |np.std|求標準差 |np.var|求方差 |np.size|分組大小

          (當然,忽略np.,直接用mean或者min也是可以的,想要用np.nanmean或者np.nanmax也是可以的)

          (注意求平均值不能用np.average,因為他不會忽略NaN值,所以如果數(shù)據(jù)中有NaN,那么np.average就會給你返回NaN)

          例如,我們要求某商品按’cancellation_policy’分類后,計算’review_scores_value’的平均值和方差,并計算’reviews_per_month’的平均值,我們可以用agg函數(shù):

          df.groupby('cancellation_policy').agg({<!-- -->'review_scores_value':(np.nanmean,np.nanstd),
                                                'reviews_per_month':np.nanmean})

          ??這里我們就能看到多重標簽了,在下文會介紹stack()和unstack()來展開、壓縮或轉(zhuǎn)換這些多重標簽。

          3.3 分組后數(shù)據(jù)轉(zhuǎn)換 (.transform())

          我們經(jīng)過對聚合函數(shù)agg的練習發(fā)現(xiàn),他對分組進行運算后得到一個單一的值(平均數(shù)、最小數(shù)、中位數(shù)等等)但如果我們要將這個數(shù)應(yīng)用到同一組的所有值上面呢?

          第一種方法是用map函數(shù),是可以的,但是我們可以一步到位,就是第二種方法,不用.agg()而用.transform(),他與.agg()最大的區(qū)別在于:

          • agg()每個組只返回一個值。- tranform()返回與組大小相同的對象。舉一個例子,我們將商品按’cancellation_policy’分類后,要查看’review_scores_value’的平均值,如果用agg()會得到以下結(jié)果,四個組,一個組對應(yīng)一個值:
          cols=['cancellation_policy','review_scores_value']

          transform_df=df[cols].groupby('cancellation_policy').agg(np.nanmean)
          transform_df

          但如果用.transform(),那么所有條數(shù)的數(shù)據(jù)的對應(yīng)的平均值就都出來了:

          cols=['cancellation_policy','review_scores_value']

          df['mean_value']=df[cols].groupby('cancellation_policy').transform(np.nanmean)
          df[['cancellation_policy','review_scores_value','mean_value']]


          3.4 分組后數(shù)據(jù)過濾 (.filter())

          如果想刪掉某些數(shù)據(jù),用.filter()就可以了,比如我們要把所有平均值>9.2的數(shù)據(jù)篩選,用lambda函數(shù)和filter就可以了,比如我們看到按strict分組后的平均值9.08,那我們看看篩選完后是否還能查到:

          df.groupby('cancellation_policy').filter(lambda x:np.nanmean(x['review_scores_value'])&gt;9.2)
          df[df['cancellation_policy']=='strict']

          3.5 分組后應(yīng)用 (.apply())

          .apply()函數(shù)功能也可以用在分組的結(jié)果后,與第二章用法一致,要注意,在apply()中調(diào)用函數(shù)時,傳入的參數(shù)是.groupby()中返回的frame。

          例如,我們想查看按’cancellation_policy’分組后’review_scores_value’與平均值的差,可以寫一個calc_mean_review_scores()的函數(shù)來實現(xiàn):

          df=pd.read_csv("datasets/listings.csv")
          df=df[['cancellation_policy','review_scores_value']]
          def calc_mean_review_scores(group):
              #print(group)##傳入的是.groupby()后的frame
              avg=np.nanmean(group['review_scores_value'])
              group['review_scores_value']=np.abs(avg-group['review_scores_value'])
              return group

          df.groupby('cancellation_policy').apply(calc_mean_review_scores).head()


          四、數(shù)據(jù)尺度 (Data Scales)

          4.1 四種尺度

          在統(tǒng)計學中,主要有四種尺度:

          1. Ratio Scale 等比尺度 可以用等比尺度來測量的變量,屬性:任意位置的單位距是相等的;數(shù)學運算的+ - * / 都是有效的;沒有真0值,0表示測量值不存在,例如:身高、體重。1. Interval Scale 等距尺度 數(shù)值之間的單位間隔是等距的一種尺度,存在真0值,例如:年份、溫度。1. Ordinal Scale 次序尺度 根據(jù)事物的特征對其進行等級排序的一種尺度,屬性:每一個數(shù)據(jù)有特殊含義;有從小到大的順序,但是間距未必是均勻的。例如:考試等級、用戶評價。1. Nominal Scale (or Categorical Data) 名目尺度 根據(jù)事物的特征對其進行分類。不具有等級排序。例如,隊伍的名稱、性別。前兩種是連續(xù)的,而后兩種是離散的。

          在DataFrame中默認的是名目尺度,查看DataFrame的type,即dtype往往發(fā)現(xiàn)是’object’類型:

          import pandas as pd
          df=pd.DataFrame(['A+''A''A-''B+''B''B-''C+''C''C-''D+''D'],
                         index=['excellent''excellent''excellent''good''good''good'
                                 'ok''ok''ok''poor''poor'],
                         columns=['Grades'])
          df.dtypes

          --Outputs:
          Grades    object
          dtype: object

          如果我們想把Categorical Data改成Ordinal Data,我們可以用.astype('category'),但此時,我們是沒有定義順序的,要給定順序,需要調(diào)用pd.CategoricalDtype來實現(xiàn),如下所示

          df['Grades'].astype('category')
          my_categories=pd.CategoricalDtype(categories=['D''D+''C-''C''C+''B-''B''B+''A-''A''A+'], 
                                            ordered=True)
          grades=df['Grades'].astype(my_categories)

          ??我們要查看比C大的類型可以直接用grades[grades&gt;'C']來實現(xiàn):

          4.2 轉(zhuǎn)化等距/等比尺度為次序尺度 (pd.cut())

          事實上,我們常常把等距或等比尺度上的事物,進行等級化,形成次序尺度。這聽起來很費解,舉個例子來說,在研究某個事情的頻率或者其分布區(qū)間的時候,我們在數(shù)據(jù)可視化時會考慮利用到直方圖來實現(xiàn),這是實際上就是對原本的等距或等比的數(shù)據(jù)進行了重新的分類。這種分類會降低數(shù)據(jù)的維度,但降維后的數(shù)據(jù)會有其額外應(yīng)用價值(比如用于機器學習中的標簽分類)

          Pandas中我們用到pd.cut()來實現(xiàn)對數(shù)據(jù)的等距分割,例如我們要計算美國每個州2010年的各個城市的平均人口統(tǒng)計數(shù)據(jù)

          import numpy as np
          import pandas as pd
          df=pd.read_csv("datasets/census.csv")
          #reduce data
          df=df[df['SUMLEV']==50]
          df=df.set_index('STNAME').groupby(level=0)['CENSUS2010POP'].agg(np.average)
          df.head()

          ??接下來用pd.cut(df,10),我們就可以得到10個等距的范圍,并看到各個州分別在哪個范圍之內(nèi):

          五、數(shù)據(jù)透視表(Pivot Table)

          5.1 數(shù)據(jù)透視表的理論

          Pandas中的數(shù)據(jù)透視表是處于特定目的對數(shù)據(jù)進行匯總,并用DataFrame格式表現(xiàn)的一種方法。他高度依賴聚合函數(shù)。??數(shù)據(jù)透視表本身也是一個DataFrame,他的代表一個你感興趣的變量,代表另一個你感興趣的變量,中間的每一個格子上是某個聚合函數(shù)的數(shù)值。有的數(shù)據(jù)透視表還會包含邊界值(merginal value),可能是每一行或者每一列的和,讓你能夠快速的查看兩個變量之間的關(guān)系。

          5.2 創(chuàng)建數(shù)據(jù)透視表(.pivot_table())

          在創(chuàng)建數(shù)據(jù)透視表的時候,我們需要明確兩個變量一個值和至少一個聚合函數(shù):

          1. 索引變量1. 列變量1. 待聚合的值1. 聚合函數(shù) pandas會根據(jù)兩個變量按索引變量進行分組,對待聚合的值進行聚合函數(shù),并將輸出值放在將每一個格子中,語法如下(也可以用pd.pivot_table(DataFrame,...)的形式創(chuàng)建):

          df.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)

          這里常用的幾個參數(shù):value就是待聚合的值,index就是索引變量(可以雙重變量),columns就是列變量(可以雙重變量),aggfunc是可以給list用以一次性進行多種聚合操作,如果列變量選了雙重變量,也可以給dict,即margins表示邊界值,默認是FALSE,名字默認為’ALL’可以在margins_name修改。

          例如,我們要對不同國家(索引變量) 不同等級的高校(列變量)(分一等、二等、三等和其他)根據(jù)總得分的評分值和最大值(待聚合值)繪制數(shù)據(jù)透視表,并給出邊界值

          df.pivot_table(values='score', index='country', columns='Rank_Level', aggfunc=[np.mean, np.max], margins=True).head()

          5.3 查詢數(shù)據(jù)透視表

          在這里我們發(fā)現(xiàn),返回的DataFrame的列名實際上是MultiIndex,第一層是mean和max,第二層是大學的四個等級,如果需要查詢里面某一行的值,也只要按這個順序來查詢即可:

          new_df['mean']['First Tier Top Unversity'].head()

          ??我們發(fā)現(xiàn)這實際上是一個Series的格式,那么我們在Series中用到的定位最大值或者最小值的函數(shù).idxmax().idxmin()就可以在這使用:

          print(new_df['mean']['First Tier Top Unversity'].idxmax())
          print(new_df['mean']['First Tier Top Unversity'].idxmin())

          5.4 更換數(shù)據(jù)透視表的形狀( .stack() & .unstack() )

          我們看到前面的數(shù)據(jù)透視表中,mean、max和四個大學是列變量,而城市是索引變量,但如果我們想要讓城市變成列變量,其他變成索引變量呢?我們先介紹兩個概念,innermost row index(最細索引變量)和lowermost column index(最細列變量),如下所示:

          • .stack()數(shù)據(jù)透視表中有一個功能是.stack(),簡而言之,它會把最細的列變量變成最細的索引變量,(注意:此時原來的country變量就不再是innermost row index了)中,如下:
          new_df.stack().head(10)

          我們可以看到,本來在mean和max下的四個大學等級就到了索引變量下,形成了MultiIndex,再次進行.stack()

          ??這次連mean和max都到了索引下面去了。

          • .unstack()有stack,自然就有.unstack(),unstack()與stack()相反,它會把最細的索引變量放到列變量去,我們對new_df進行.unstack()操作看看會發(fā)生什么:
          new_df.unstack()

          ??有沒有很奇怪,為什么變成了一個Series?

          還記得我們說過DataFrame中row和columns實際上是等價的,在這里,所有的索引變量都到列變量去了,沒了索引變量,DataFrame自然就成了一個原DataFrame中列變量作index的Series,這時如果把這個Series想象成一般形式的DataFrame,那這三個index也可以看作新的DataFrame中的index,所以,如果我們再進行一次.unstack(),它就會又變成DataFrame了:

          ??在這里我們就可以看到,原本Series中的最細的index:country就變成了列變量,所以,理論上我們可以添加若干個.unstack(),依舊能得到DataFrame,但若干個.stack()一定是不行的,因為你不能對Series進行.stack():

          六、Pandas里的時間(Date/Time Functionality)

          pandas中的時間函數(shù)主要分為四個class:

          Timestamp, Period, 以及這兩種時間所對應(yīng)的index:Datetimeindex和Periodindex。

          6.1 時間戳(pd.Timestamp()與.isoweekday())

          如果想創(chuàng)建一個時間戳,利用pd.Timestamp()就可以了:

          pd.Timestamp('9/1/2019 10:05AM')
          pd.Timestamp('2019/1/20 10:05AM')
          pd.Timestamp('2019-1-9 10:05AM')
          pd.Timestamp('20190109 10:05AM')
          pd.Timestamp('01-09-2019 10:05AM')
          pd.Timestamp('2021 2 SEPT')

          以上幾種都是可以的,可以發(fā)現(xiàn)Pandas支持歐式時間表達式和美式時間表達式,最后得到的都是’yyyy-mm-dd hh:mm:ss’的Timestamp格式 也可以通過直接給’yyyy-mm-dd hh:mm:ss’賦值的方法創(chuàng)建:

          pd.Timestamp(2019, 12, 20, 0, 0)

          --Outputs:
          Timestamp('2019-12-20 00:00:00')

          查詢的時候直接.year或者.month…就可以查詢對應(yīng)的年/月/日/時/分/秒了。

          如果你想知道這是一周的第幾天,可以用.isoweekday()功能:

          pd.Timestamp(2019, 12, 20, 0, 0).isoweekday()

          --Outputs:
          5

          Timestamp也可以用Timedelta來表示時間間隔,和datetime中的timedelta是一樣的。

          pd.Timestamp('9/3/2016')-pd.Timestamp('9/1/2016')
          pd.Timestamp('9/2/2016 8:10AM') + pd.Timedelta('12D 3H')

          6.2 周期(pd.Period())

          如果我們不是對某個時間點感興趣而是對某個時間區(qū)間感興趣,可以用pd.Period(),他會自動給時間加上單位,比如’M’表示月’D’表示日,'A-DEC’表示以年為周期,可以對Period()值直接做+ -運算,會在對應(yīng)周期下進行運算:

          pd.Period('2021-02')
          pd.Period('2021-02')+2
          pd.Period('2021-02-10')+2

          6.3 時間索引之(Datetimeindex與PeriodIndex)

          如果我們將Timestamp作為Series或者DataFrame的索引,那么其格式是DatetimeIndex,如果我們將Period作為Series或者DataFrame的索引,其格式是

          PeriodIndex:
          A=[2,3]
          time1=pd.Timestamp('2021-09-11')
          time2=pd.Timestamp('2021-09-23')
          s=pd.Series(A,index=[time1,time2])
          type(s.index)

          --Outputs:
          pandas.core.indexes.datetimes.DatetimeIndex

          t1=pd.Period('2021-02')
          t2=pd.Period('2021-02')
          s=pd.Series(A,index=[t1,t2])
          type(s.index)

          --Outputs:
          pandas.core.indexes.period.PeriodIndex

          6.4 轉(zhuǎn)化成時間格式(pd.to_dayetime())

          pd.to_dayetime()可以把各種歐式時間格式、美式時間格式轉(zhuǎn)位一般的’yyyy-mm-dd’格式,如下:

          time=['2021-09-10','2019/10/12','2021 2 JUNE','JULY 4, 2021','JANUARY 2 2012']

          pd.to_datetime(time)

          6.5 pd.offsets

          可以在Timestamp后添加pd.offsets來實現(xiàn)某個功能,比如,可以用+pd.offsets.Week()來輸出一周后的日期,用+pd.offsets.MonthEnd()來查看本月的月末是哪一天

          6.6 時間范圍(pd.date_range())

          就像生成一個數(shù)值列表一樣,可以用pd.date_range()來生成一個時間的列表,語法是:pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs) ??設(shè)置好起始日期,區(qū)間長度periods或者頻率freq,tz還可以設(shè)置時區(qū),默認’timezone-naive’ ??例如,我們想生成2021年9月11日以后每兩個周的周末的日期,時間區(qū)間長度為9,可以用以下代碼:

          time1=pd.Timestamp('2021-09-11')
          pd.date_range(time1,periods=9,freq='2W-SUN')

          可以直接用這個來做DataFrame的index:

          time_period=pd.date_range(time1,periods=9,freq='2W-SUN')
          data={<!-- -->'Count1':120+np.random.randint(-5,10,9),
               'Count2':120+np.random.randint(-5,10,9),
               }
          dates=pd.DataFrame(data,index=time_period)


          6.7 根據(jù)Datetime計算每個月的平均值(.resample())

          從高頻率到低頻率可以用resample(),例如我們想計算上面DataFrame中每個月的平均值,可以用:

          df.resample('M').mean()




          Python“寶藏級”公眾號【Python之王】專注于Python領(lǐng)域,會爬蟲,數(shù)分,C++,tensorflow和Pytorch等等。

          近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:

          日常收集整理了一批不錯的 Python 學習資料,有需要的小伙可以自行免費領(lǐng)取。

          獲取方式如下:公眾號回復資料。領(lǐng)取Python等系列筆記,項目,書籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊和 C++ 等學習資料!

          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩中文字幕第一页 | 伊人国产综合视频在线 | wwwaaa| 狠操欧美 | 久热无码一区二区三区 |