日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3-10 Pandas的数据规整

發(fā)布時間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3-10 Pandas的数据规整 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)據(jù)分析工具pandas

  • 10. Pandas的數(shù)據(jù)規(guī)整
    • 10.1 層次化索引
    • 10.2 數(shù)據(jù)連接
      • 10.2.1 pd.merge
      • 10.2.2 pd.concat
    • 10.3 重塑
      • 10.3.1 stack
      • 10.3.2 unstack
    • 10.4 軸向旋轉(zhuǎn)

Pandas是一個強大的分析結(jié)構(gòu)化數(shù)據(jù)的工具集,基于NumPy構(gòu)建,提供了 高級數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)操作工具,它是使Python成為強大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一
(1) 一個強大的分析和操作大型結(jié)構(gòu)化數(shù)據(jù)集所需的工具集
(2) 基礎(chǔ)是NumPy,提供了高性能矩陣的運算
(3) 提供了大量能夠快速便捷地處理數(shù)據(jù)的函數(shù)和方法
(4)應(yīng)用于數(shù)據(jù)挖掘,數(shù)據(jù)分析
(5)提供數(shù)據(jù)清洗功能

10. Pandas的數(shù)據(jù)規(guī)整

10.1 層次化索引

Pandas的層次化索引簡述,包括層級索引簡介、內(nèi)外層選取、交換等

#層次化索引 import numpy as np import pandas as pd data = pd.Series(np.random.randn(9),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,3,1,2,2,2,3]]) #內(nèi)外層選取 data['b':'c'] data.loc[['b','d']] data.loc[:,2]frame = pd.DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':[0,1,2,0,1,2,3]}) #結(jié)果為: # a b c d #0 0 7 one 0 #1 1 6 one 1 #2 2 5 one 2 #3 3 4 two 0 #4 4 3 two 1 #5 5 2 two 2 #6 6 1 two 3 frame #指定列轉(zhuǎn)換為層次化索引 frame2 = frame.set_index(['c','d']) #結(jié)果為: # a b #c d #one 0 0 7 # 1 1 6 # 2 2 5 #two 0 3 4 # 1 4 3 # 2 5 2 # 3 6 1 frame2#指定列轉(zhuǎn)換為層次化索引,不刪除指定列 #結(jié)果為: # a b c d #c d #one 0 0 7 one 0 # 1 1 6 one 1 # 2 2 5 one 2 #two 0 3 4 two 0 # 1 4 3 two 1 # 2 5 2 two 2 # 3 6 1 two 3 frame.set_index(['c','d'],drop=False)#消除層級索引 #結(jié)果為: # c d a b #0 one 0 0 7 #1 one 1 1 6 #2 one 2 2 5 #3 two 0 3 4 #4 two 1 4 3 #5 two 2 5 2 #6 two 3 6 1 frame2.reset_index()

10.2 數(shù)據(jù)連接

10.2.1 pd.merge

pd.merge(left,right,how=‘inner’,on=None,left_on=None,right_on=None):根據(jù)單個或多個鍵將不同DataFrame的行連接起來,類似數(shù)據(jù)庫的連接操作。

  • left:合并時左邊的DataFrame
  • right:合并時右邊的DataFrame
  • how:合并的方式默認’inner’,‘outer’,‘left’,‘right’
  • on:需要合并的列名,必須兩邊都有的列名,并以left和right中的列名的交集作為連接鍵
  • left_on:left DataFrame中用作連接鍵的列
  • right_on:right DataFrame中用作連接鍵的列
#數(shù)據(jù)連接 left = pd.DataFrame({'key':['K0','K1','K2','K3'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']}) right = pd.DataFrame({'key':['K0','K1','K2','K3'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']}) #結(jié)果為: # key A B #0 K0 A0 B0 #1 K1 A1 B1 #2 K2 A2 B2 #3 K3 A3 B3 left #結(jié)果為: # key C D #0 K0 C0 D0 #1 K1 C1 D1 #2 K2 C2 D2 #3 K3 C3 D3 right#根據(jù)單個或多個鍵將不同的DataFrame的行連接起來,類似數(shù)據(jù)庫的連接操作 #結(jié)果為: # key A B C D #0 K0 A0 B0 C0 D0 #1 K1 A1 B1 C1 D1 #2 K2 A2 B2 C2 D2 #3 K3 A3 B3 C3 D3 pd.merge(left,right) #指定連接鍵(列) pd.merge(left,right,on='key')#處理重復列名 df_obj1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data':np.random.randint(0,10,7)}) df_obj2 = pd.DataFrame({'key':['a','b','d'],'data':np.random.randint(0,10,3)}) #添加后綴 #結(jié)果為: # key data_left data_right #0 b 9 1 #1 b 7 1 #2 b 3 1 #3 a 7 7 #4 a 8 7 #5 a 8 7 print(pd.merge(df_obj1,df_obj2,on='key',suffixes=('_left','_right')))#按索引連接 #left_index=True或right_index=True df_obj1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':np.random.randint(0,10,7)}) df_obj2 = pd.DataFrame({'data2':np.random.randint(0,10,3)},index=['a','b','d']) #left表根據(jù)key連接,right表根據(jù)索引連接 #結(jié)果為: # key data1 data2 #0 b 7 0 #1 b 2 0 #6 b 8 0 #2 a 2 3 #4 a 8 3 #5 a 4 3 print(pd.merge(df_obj1,df_obj2,left_on='key',right_index=True))#數(shù)據(jù)合并 join left2 = pd.DataFrame([[1.,2.],[3.,4.],[5.,6.]],index = ['a','c','e'],columns=['語文','數(shù)學']) right2 = pd.DataFrame([[7.,8.],[9.,10.],[11.,12.],[13.,14.]],index=['b','c','d','e'],columns=['英語','綜合']) #使用join進行索引連接,要求沒有重疊的列名 #效果與pd.merge(left2,right2,how='outer',left_index=True,right_index=True)一致 left2.join(right2,how='outer')

10.2.2 pd.concat

沿著軸方向?qū)⒍鄠€對象合并到一起

  • np.concat
  • #np.concat arr1 = np.random.randint(0,10,(3,4)) arr2 = np.random.randint(0,10,(3,4)) #結(jié)果為:(行合并) #[[8 8 4 0] # [7 0 1 2] # [3 0 9 3] # [6 4 2 7] # [3 3 9 0] # [3 5 3 9]] print(np.concatenate([arr1,arr2])) #結(jié)果為:(列合并) #[[8 8 4 0 6 4 2 7] # [7 0 1 2 3 3 9 0] # [3 0 9 3 3 5 3 9]] print(np.concatenate([arr1,arr2],axis=1))
  • pd.concat
    (1)注意指定軸方向,默認axis=0
    (2)join指定合并方式,默認為outer
    (3) Series合并時查看行索引有無重復
  • #pd.concat #df1: # one two #a 0 1 #b 2 3 #c 4 5 df1 = pd.DataFrame(np.arange(6).reshape(3,2),index=list('abc'),columns=['one','two']) #df2: # one two #a 0 1 #c 2 3 df2 = pd.DataFrame(np.arange(4).reshape(2,2),index=list('ac'),columns=['one','two'])#默認外連接 axis=0 (常用) #結(jié)果為: # one two #a 0 1 #b 2 3 #c 4 5 #a 0 1 #c 2 3 pd.concat([df1,df2]) #結(jié)果為: # one two one two #a 0 1 0.0 1.0 #b 2 3 NaN NaN #c 4 5 2.0 3.0 pd.concat([df1,df2],axis=1)

    10.3 重塑

    10.3.1 stack

    (1) 將列索引旋轉(zhuǎn)為行索引,完成層級索引
    (2)DataFrame -> Series

    ###重塑層次化索引 data = pd.DataFrame(np.arange(6).reshape((2,3)),index = pd.Index(['老王','小劉'],name='姓名'),columns = pd.Index(['語文','數(shù)學','英語'],name='科目')) #科目 語文 數(shù)學 英語 #姓名 #老王 0 1 2 #小劉 3 4 5 data#stack將列索引旋轉(zhuǎn)為行索引,完成層級索引 r = data.stack() #結(jié)果為: #姓名 科目 #老王 語文 0 # 數(shù)學 1 # 英語 2 #小劉 語文 3 # 數(shù)學 4 # 英語 5 print(r) #結(jié)果為:<class 'pandas.core.series.Series'> print(type(r))

    10.3.2 unstack

    (1)將層級索引展開
    (2)Series -> DataFrame
    (3)默認操作內(nèi)層索引(即level=-1),可通過設(shè)置level指定操作索引的級別

    #將層級索引展開 #結(jié)果為: #科目 語文 數(shù)學 英語 #姓名 #老王 0 1 2 #小劉 3 4 5 r.unstack()#可簡寫為r.unstack('姓名') #結(jié)果為: #姓名 老王 小劉 #科目 #語文 0 3 #數(shù)學 1 4 #英語 2 5 r.unstack(level = '姓名')a1 = pd.Series(np.arange(4),index=list('abcd')) a2 = pd.Series([4,5,6],index=list('cde')) #結(jié)果為: #data1 a 0 # b 1 # c 2 # d 3 #data2 c 4 # d 5 # e 6 s1 = pd.concat([a1,a2],keys=['data1','data2']) #結(jié)果為:pandas.core.series.Series type(s1) #結(jié)果為: # a b c d e #data1 0.0 1.0 2.0 3.0 NaN #data2 NaN NaN 4.0 5.0 6.0 s1.unstack()#stack()默認過濾缺失數(shù)據(jù)(例如NaN值),可通過設(shè)置dropna=False不過濾缺失值 #結(jié)果為: #data1 a 0.0 # b 1.0 # c 2.0 # d 3.0 # e NaN #data2 a NaN # b NaN # c 4.0 # d 5.0 # e 6.0 s1.unstack().stack()

    10.4 軸向旋轉(zhuǎn)

    #軸向旋轉(zhuǎn) df3 = pd.DataFrame({'date':['2018-11-22','2018-11-22','2018-11-23','2018-11-23','2018-11-24'],'class':['a','b','b','c','c'],'values':[5,3,2,6,1]},columns=['date','class','values']) # date class values #0 2018-11-22 a 5 #1 2018-11-22 b 3 #2 2018-11-23 b 2 #3 2018-11-23 c 6 #4 2018-11-24 c 1 df3#結(jié)果為: #class a b c # date # 2018-11-22 5.0 3.0 NaN # 2018-11-23 NaN 2.0 6.0 # 2018-11-24 NaN NaN 1.0 df3.pivot('date','class','values')#結(jié)果為: # values #class a b c # date # 2018-11-22 5.0 3.0 NaN # 2018-11-23 NaN 2.0 6.0 # 2018-11-24 NaN NaN 1.0 df3.set_index(['date','class']).unstack('class')

    總結(jié)

    以上是生活随笔為你收集整理的3-10 Pandas的数据规整的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。