1. 程式人生 > >Python資料分析--Pandas知識點(二)

Python資料分析--Pandas知識點(二)

13. 簡單計算

新建一個數據表df

複製程式碼
1 import pandas as pd
2 
3 df = pd.DataFrame({"地區": ["A區","B區", "C區"],
4                    "前半年銷量": [3500, 4500,3800],
5                    "後半年銷量": [3000, 6000,5000],
6                    "單價": [10, 18, 15]})
7 df
複製程式碼

 13.1 加法計算

有兩種方式, 一種是利用add()函式: a.add(b) 表示a與b之和, 另一種是直接利用加法運算子號"+"

1 #第一種方式: 利用add()函式
2 # df["總銷量"] = df["前半年銷量"].add(df["後半年銷量"])
3 #第二種方式: "+"
4 df["總銷量"] = df["前半年銷量"] + df["後半年銷量"]
5 df

 兩者運算的結果都是相同的:

對於累加求和上述兩種方法同樣適用, 還有一種方式就是採用apply()函式, 參考文件: https://blog.csdn.net/luckarecs/article/details/72869051

這裡介紹apply(func, axis = 0)函式的兩個引數, apply()函式官方文件: 

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html?highlight=apply#pandas.DataFrame.apply

第一個引數func就是指用於每行或者每列的函式, 這裡將採用lambda函式: 接收任意多個引數並返回單個計算結果.

第二個引數axis=0則表示計算行與行的資料, axis=1則表示計算列與列的資料

1 #由於地區不能參與運算, 因此在df1資料表中刪除地區
2 df1 = df.drop(["地區","單價"], axis = 1, inplace = False)
3 #對df1資料表進行累加運算, 隨後新增到df表中.
4 df["總銷量"] = df1.apply(lambda x: x.sum(), axis = 1)
5 df

1 #刪除地區和單價,分別計算前半年與後半年的三個地區總和.
2 df2 = df.drop(["地區","單價"], axis = 1, inplace = False)
3 #利用apply函式計算之後,新增至資料表中
4 df.loc["Sum"] = df2.apply(lambda x: x.sum(), axis = 0 )
5 df

13.2 減法運算

同樣有兩種方式: 一種是採用sub()函式, A.sub(B)表示A-B, 另一種是採用減法運算子 "-"

1 #函式法: 注意A.sub(B)表示A-B
2 df["銷量增長"] = df["後半年銷量"].sub(df["前半年銷量"])
3 #運算子: "-"
4 df["銷量增長"] = df["後半年銷量"] - df["前半年銷量"] 
5 df

兩種方式, 同樣的結果:

13.3 乘法運算

 同樣是兩種方式: 一種是採用mul()函式: A.mul(B)表示: A與B之積, 另一種則是乘法運算子 "*"

1 #函式法: A.mul(B)
2 df["前半年銷售額"] = df["前半年銷量"].mul(df["單價"])
3 #運算子: "*"
4 df["後半年銷售額"] = df["後半年銷量"] * df["單價"]
5 df

13.4 除法運算

同樣是兩種: 一種是採用div()函式: A.div(B)表示: A除以B, 第二種則是採用除法運算子"/"

1 #函式法
2 df["前半年銷量1"] = df["前半年銷量"].div(100)
3 #運算子法
4 df["前半年銷量2"] = df["前半年銷量"] / 1000
5 df

 

13.5 其他運算

13.5.1 取整和取餘

1 #取整符號: "//"
2 df["後半年銷量1"] = df["後半年銷量"] // 1000
3 #取餘符號: "%"
4 df["前半年銷量1"] = df["前半年銷量"] // 100 % 10
5 df

 

13.5.2 聚合運算

採用聚合函式對一組資料進行運算, 並返回單個值, 比如最大值max()函式, 最小值min()函式, 平均值mean()函式

複製程式碼
1 #求前半年銷量最大值
2 df1 = df["前半年銷量"].max()
3 #求後半年銷量最小值
4 df2 = df["後半年銷量"].min()
5 #求單價的平均值
6 df3 = df["單價"].mean()
7 df1, df2 ,df3
複製程式碼
(4500, 3000, 14.333333333333334)

14. 0-1標準化

0-1標準化是對原始資料進行線性變換, 使其結果對映成[0,1]區間的值, 計算公式為: 新資料 = (原資料 - 最小值) / (最大值 - 最小值)

1 import pandas as pd
2 df = pd.DataFrame({"地區": ["A區","B區", "C區", "D區", "E區", "F區"],
3                    "銷量": [3500, 4500,3800,3000, 6000,5000]})
4 #利用公式對原始資料進行0-1標準化處理
5 df["0-1"] = (df["銷量"] - df["銷量"].min()) / (df["銷量"].max() - df["銷量"].min())
6 df

15. 資料分組

資料分組是根據統計研究的需求, 對原始資料按照某種標準劃分為不同的組別. 主要目的是觀察資料的分佈特徵. 在資料分組後再計算出各組中資料出現的的頻數, 最終形成頻數分佈表.

pandas中資料分組採用的函式是cut(x, bins, right = True, labels = None)函式:

第一個引數x指的是要分組的資料

第二個引數bins指的是劃分標準, 也就是定義組的上限與下限

第三個引數right = True表示右邊閉合, 左邊不閉合; 當right = False時表示右邊不閉合, 左邊閉合, 預設為True.

第四個引數則是自定義分組的內容

更多cut()函式相關參考官方文件: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html?highlight=cut#pandas.cut

複製程式碼
1 import pandas as pd
2 df = pd.DataFrame({"地區": ["A區","B區", "C區", "D區", "E區", "F區", "G區"],
3                    "單價": [ 8 , 20, 15, 7, 34, 25, 30]})
4 #對單價進行編組: (5,15),(15,25),(25,35)
5 bins = [5, 15, 25, 35]
6 #利用cut()函式對單價進行分組, 並新增至原資料表中
7 df["分組"] = pd.cut(df.單價, bins)
8 df
複製程式碼

自定義labels:

複製程式碼
1 import pandas as pd
2 df = pd.DataFrame({"地區": ["A區","B區", "C區", "D區", "E區", "F區", "G區"],
3                    "單價": [ 8 , 20, 15, 7, 34, 25, 30]})
4 bins = [5, 15, 25, 35]
5 #自定義labels
6 labels = ["15以下", "15到25", "25以上"]
7 df["分組"] = pd.cut(df.單價, bins, labels = labels)
8 df
複製程式碼

 

16. 日期轉換

日期轉換是指將字元型別轉換成日期格式.

16.1 to_datetime方法

可使用to_datetime(arg, format = None)函式轉換

第一個引數arg則是需要轉化的字串, 比如"2018/09/01"

第二個引數format則是原字串中日期的格式, 比如"2018/09/01"的格式為 "%Y/%m/%d"

常用的格式有: %y表示兩位數的年份, %Y表示四位數的年份, %m表示月份, %d表示月中的某一天, %H表示24小時制時數, %I表示12小時制時數, %M表示分鐘, %S表示秒

to_datetime()函式官方文件: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html?highlight=to_datetime#pandas.to_datetime

1 import pandas as pd
2 df = pd.DataFrame({"name":["A","B","D"],
3                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})
4 #轉成日期格式
5 df["BD"] = pd.to_datetime(df.BirthDate,format = "%Y/%m/%d")
6 df

 

1 #檢視資料型別
2 df.dtypes

16.2 datetime.strptime()方法

藉助datetime模組中datetime類的strptime()方法, 將字元型別轉化為日期格式.

strptime(date_string, format)方法中有兩個引數, 第一個引數則是要轉化的字串, 第二個引數則為字串中日期的格式

複製程式碼
1 import pandas as pd
2 from datetime import datetime
3 df = pd.DataFrame({"name":["A","B","D"],
4                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})
5 #轉化為日期格式
6 df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))
7 df
複製程式碼

17. 日期格式化

日期格式化就是將日期按照指定的格式輸出成字元型別, 這裡藉助datetime模組中datetime類的strftime()方法實現:

複製程式碼
1 import pandas as pd
2 from datetime import datetime
3 df = pd.DataFrame({"name":["A","B","D"],
4                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})
5 #轉化為日期格式
6 df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))
7 #日期格式化
8 df["BD1"] = df["BD"].apply(lambda x: datetime.strftime(x, "%d-%m-%Y %H:%M:%S"))
9 df
複製程式碼

18.日期抽取

從日期格式中抽取日期的部分內容, 比如抽取年份, 月份等. 語法: 轉換為日期格式的列.dt.要抽取的屬性.

複製程式碼
 1 import pandas as pd
 2 from datetime import datetime
 3 df = pd.DataFrame({"name":["A","B","D"],
 4                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})
 5 df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))
 6 df["year"] = df["BD"].dt.year
 7 df["month"] = df["BD"].dt.month
 8 df["day"] = df["BD"].dt.day
 9 df["hour"] = df["BD"].dt.hour
10 df["minute"] = df["BD"].dt.minute
11 df["second"] = df["BD"].dt.second
12 df["weekday"] = df["BD"].dt.weekday
13 df
複製程式碼

原文來自:https://www.cnblogs.com/star-zhao/p/9715307.html