pandas學習(數據分組與分組運算、離散化處理、數據合並)
目錄
數據分組與分組運算
離散化處理
數據合並
數據分組與分組運算
GroupBy技術:實現數據的分組,和分組運算,作用類似於數據透視表 數據分組--〉歸納
程序示例:
import numpy as np import pandas as pd # 讀入數據 df=pd.read_csv('data1.txt') print('原始數據') print(df) #返回一個對象 group=df.groupby(df['產地']) #計算分組后的各個統計值 print('根據產地進行分組') print(group.mean()) print(group.sum()) # 只計算某列的結果 print('根據年代進行分組,然后統計每一個年代的平均評分') print(df['評分'].groupby(df['年代']).mean()) #根據多個分組變量進行分組 print('多個分組變量進行分組') print(df.groupby([df['產地'],df['年代']]).mean()) #獲得每一個地區,每一年的電影的評分的均值 print('多個分組變量進行分組之操作某列') print(df['評分'].groupby([df['產地'],df['年代']]).mean())
運行結果:
原始數據 名字 投票人數 類型 產地 上映時間 時長 年代 評分 0 美麗人生 42995 劇情/喜劇/愛情 意大利 1997-12-20 116 1997 9.5 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4
根據產地進行分組 投票人數 時長 年代 評分 產地 中國大陸 478523.000000 171.000000 1993.000000 9.4 意大利 42995.000000 116.000000 1997.000000 9.5 美國 438895.666667 133.333333 1981.666667 9.5
投票人數 時長 年代 評分 產地 中國大陸 478523 171 1993 9.4 意大利 42995 116 1997 9.5 美國 1316687 400 5945 28.5
根據年代進行分組,然后統計每一個年代的平均評分 年代 1957 9.5 1993 9.4 1994 9.5 1997 9.5 Name: 評分, dtype: float64
多個分組變量進行分組 投票人數 時長 評分 產地 年代 中國大陸 1993 478523 171 9.4 意大利 1997 42995 116 9.5 美國 1957 42995 116 9.5 1994 636846 142 9.5
多個分組變量進行分組之操作某列 產地 年代 中國大陸 1993 9.4 意大利 1997 9.5 美國 1957 9.5 1994 9.5 Name: 評分, dtype: float64
離散化處理
#在實際的數據分析項目中,對有數據屬性,我們往往並不是關注數據的絕對數值,只關注它所處的區間或者等級 # 比如,我們可以把評分9分及以上的電影定義為A,7到9分為B,5到7分定義為C,3到5分定義為D,小於3分定義為E #離散化也被稱為分組,區間化 #pandas為我們提供了方便的函數cut() # pandas.cut( x , bins , right=True , labels=None , retbins=False , precision=3 , include_lowest=False,duplicates='raise') # 參數說明: # # x : 進行划分的一維數組; # bins :如果是整數---將x划分為多少個等間距的區間,如代碼一; # bins :如果是序列,則將x划分在指定的序列中,若不在該序列中,則是NaN ,如代碼二; # right : 是否包含右端點; # labels : 是否用標記來代替返回的bins,如代碼三; # retbins: 是否返回間距bins,如果retbins = False 則返回x中每個值對應的bin的列表,否者則返回x中每個值對應的bin的列表和對應的bins; # precision: 精精度; # include_lowest:是否包含左端點;
程序示例:
import numpy as np import pandas as pd # 讀入數據 df=pd.read_csv('data1.txt') print('原始數據') print(df) data=pd.cut(df['評分'],[0,3,5,7,9,10],labels=['E','D','C','B','A']) print(data) df['等級']=data print(df)
運行結果:
原始數據 名字 投票人數 類型 產地 上映時間 時長 年代 評分 0 美麗人生 42995 劇情/喜劇/愛情 意大利 1997-12-20 116 1997 9.5 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4 0 A 1 A 2 A 3 A 4 A Name: 評分, dtype: category Categories (5, object): [E < D < C < B < A]
名字 投票人數 類型 產地 上映時間 時長 年代 評分 等級 0 美麗人生 42995 劇情/喜劇/愛情 意大利 1997-12-20 116 1997 9.5 A 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 A 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 A 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 A 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4 A
數據合並
append(上下拼接)
import numpy as np import pandas as pd # 讀入數據 df=pd.read_csv('data1.txt') print('原始數據') print(df) # (1)append(上下拼接) # 先把數據集拆分為多個,再進行合並 df_1=df[df.產地 =="美國"] df_2=df[df.產地 == "中國大陸"] df_3=df_1.append(df_2)#append() print(df_3)
原始數據 名字 投票人數 類型 產地 上映時間 時長 年代 評分 0 美麗人生 42995 劇情/喜劇/愛情 意大利 1997-12-20 116 1997 9.5 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4
#合並后的數據 名字 投票人數 類型 產地 上映時間 時長 年代 評分 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4
merge (左右合並)
# merge: 合並數據集, 通過left, right確定連接字段,默認是兩個數據集相同的字段 # 參數 說明 # left 參與合並的左側DataFrame # right 參與合並的右側DataFrame # how 連接方式:‘inner’(默認);還有,‘outer’、‘left’、‘right’ # on 用於連接的列名,必須同時存在於左右兩個DataFrame對象中,如果位指定,則以left和right列名的交集作為連接鍵 # left_on 左側DataFarme中用作連接鍵的列 # right_on 右側DataFarme中用作連接鍵的列 # left_index 將左側的行索引用作其連接鍵 # right_index 將右側的行索引用作其連接鍵 # sort 根據連接鍵對合並后的數據進行排序,默認為True。有時在處理大數據集時,禁用該選項可獲得更好的性能 # suffixes 字符串值元組,用於追加到重疊列名的末尾,默認為(‘_x’,‘_y’).例如,左右兩個DataFrame對象都有‘data’,則結果中就會出現‘data_x’,‘data_y’ # copy 設置為False,可以在某些特殊情況下避免將數據復制到結果數據結構中。默認總是賦值 # ”’ #有朋友總結了使用,所以直接引用了 # https://www.cnblogs.com/lijinze-tsinghua/p/9878649.html
concat():
批量數據合並(兩個數據及以上)
上下合並
import numpy as np import pandas as pd # 讀入數據 df=pd.read_csv('data1.txt') print('原始數據') print(df) # (1)append(上下拼接) # 先把數據集拆分為多個,再進行合並 df_1=df[df.產地 =="美國"] df_2=df[df.產地 == "中國大陸"] print(pd.concat([df_1,df_2]))
原始數據 名字 投票人數 類型 產地 上映時間 時長 年代 評分 0 美麗人生 42995 劇情/喜劇/愛情 意大利 1997-12-20 116 1997 9.5 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4 名字 投票人數 類型 產地 上映時間 時長 年代 評分 1 阿甘正傳 580897 劇情/愛情 美國 1994-06-23 142 1994 9.4 2 肖申克的救贖 692795 劇情/犯罪 美國 1994-09-10 142 1994 9.6 3 控方證人 42995 劇情/懸疑/犯罪 美國 1957-12-17 116 1957 9.5 4 霸王別姬 478523 劇情/愛情/同性 中國大陸 1993-01-01 171 1993 9.4