概述
python 的 pandas 庫用來處理表格型別(也就是矩陣)的資料非常方便, 這個庫用來在可視化之前對資料進行變換,計算和匯總之類的操作再好不過,
下面整理了最近我在做資料分析的短視頻時常用的一些方法,
讀取資料檔案
做視頻之前,我采集的資料都是用 csv 格式保存的,這里主要演示 pandas 庫的 read_csv 方法,
讀取其他檔案格式的方式類似,主要是函式名稱不同,引數都差不多,
讀取 csv 檔案
讀取 csv 檔案非常簡單,指定 csv 檔案的路徑即可, 測驗用 csv 檔案內容如下:
IP地址,手機號,登錄日期
223.104.147.75,19951762925,"2021-04-15 01:33:08"
117.181.52.75,15873565020,"2021-04-15 01:48:24"
42.49.165.99,18673535620,"2021-04-15 02:14:40"
14.116.141.24,18673535620,"2021-04-15 05:01:40"
# -*- coding: utf-8 -*-
import pandas as pd
def test():
df = pd.read_csv(
"~/share/test.csv",
)
print(df)
if __name__ == "__main__":
test()
程式運行結果:
$ python test.py
IP地址 手機號碼 登錄日期
0 223.104.147.75 1.995176e+10 2021-04-15 01:33:08
1 117.181.52.75 1.587357e+10 2021-04-15 01:48:24
2 42.49.165.99 1.867354e+10 2021-04-15 02:14:40
3 14.116.141.24 1.867354e+10 2021-04-15 05:01:40
讀取之后修改列的名稱,指定列的型別
csv 檔案中的列名有時候沒有,或者有時候是中文的,列名是后續進行操作資料時使用的 key,一般在讀取時將其轉換成英文,
同時,可以看出手機號碼默認被當成數值型別了,所以用科技計數法來表示,在讀取資料時,可以設定此列為字串型別,
# -*- coding: utf-8 -*-
import pandas as pd
def test():
df = pd.read_csv(
"~/share/test.csv",
skiprows=[0],
names=["ip", "mobile", "login_date"],
dtype={"mobile": str},
)
print(df)
if __name__ == "__main__":
test()
- skiprows 可以用來忽略第一行標題,因為我們用 names 指定了新的標題名稱,
- dtype 用來指定某列的型別,不指定的話,系統自動推斷型別,
程式運行結果:
$ python test.py
ip mobile login_date
0 223.104.147.75 19951762925 2021-04-15 01:33:08
1 117.181.52.75 15873565020 2021-04-15 01:48:24
2 42.49.165.99 18673535620 2021-04-15 02:14:40
3 14.116.141.24 18673535620 2021-04-15 05:01:40
列的名稱已替換,手機號碼也正常顯示,
讀取 csv 檔案的某幾列
在分析資料時,有時候我們不需要采集的所有資料,只取其中需要的幾列資料,
比如上面的 csv,如果只分析 IP 地址和登錄時間,讀取檔案時,可以只取這 2 列資料,
# -*- coding: utf-8 -*-
import pandas as pd
def test():
df = pd.read_csv(
"~/share/test.csv",
skiprows=[0],
usecols=[0, 2],
names=["ip", "login_date"],
)
print(df)
if __name__ == "__main__":
test()
通過 usecols 來指定需要那幾列, 程式運行結果:
$ python test.py
ip login_date
0 223.104.147.75 2021-04-15 01:33:08
1 117.181.52.75 2021-04-15 01:48:24
2 42.49.165.99 2021-04-15 02:14:40
3 14.116.141.24 2021-04-15 05:01:40
讀取時對某些列進行轉換
有些列的格式,比如日期格式的列,可能在分析之前就要進行轉換處理,
上面的例子中,如果是按日分析登錄情況,就不要時分秒的部分,這樣我們可以在讀取時就進行轉換處理,
# -*- coding: utf-8 -*-
from datetime import datetime
import pandas as pd
def test():
df = pd.read_csv(
"~/share/test.csv",
skiprows=[0],
usecols=[0, 2],
names=["ip", "login_date"],
converters={
"login_date": lambda d: datetime.strptime(d, "%Y-%m-%d %H:%M:%S").strftime(
"%Y-%m-%d"
)
},
)
print(df)
if __name__ == "__main__":
test()
通過 converters 引數轉換某列, 程式運行結果:
$ python test.py
ip login_date
0 223.104.147.75 2021-04-15
1 117.181.52.75 2021-04-15
2 42.49.165.99 2021-04-15
3 14.116.141.24 2021-04-15
資料的操作
讀取檔案之后,得到一個 dataframe 結構,它可以當成一個矩陣來看,
基于 dataframe,可以完成各種計算操作,pandas 提供的 API 也很多,這里只介紹我平時常用的一部分,
分組統計
之前做房價分析時,按月分析成交平均值和成交總套數時,都用到了分組統計,
分析的第一步就是將資料分組,
# -*- coding: utf-8 -*-
import pandas as pd
test_data = https://www.cnblogs.com/wang_yb/p/{"name": ["a", "b", "c", "d"],
"value": [11, 20, 31, 42],
"date": ["2017", "2018", "2018", "2017"],
}
def main():
df = pd.DataFrame(test_data)
data = https://www.cnblogs.com/wang_yb/p/df.groupby("date")
data = https://www.cnblogs.com/wang_yb/p/data.sum()
print(data)
if __name__ =="__main__":
main()
按照日期分組之后,運行結果如下:
$ python test2.py
value
date
2017 53
2018 51
這里是求和,groupby 之后同樣也可以求平均值,
資料集變換
資料集變換是用的比較多的,因為采集和分析的程序是分開的,采集的目的是資料盡量全和準確,
所以分析之前會根據分析目的會對資料進行適當的變換,
行操作
行操作主要指從資料集中過濾出一部分資料,或者合并多個資料集,
-
過濾資料
# -*- coding: utf-8 -*- import pandas as pd test_data = https://www.cnblogs.com/wang_yb/p/{"name": ["a", "b", "c", "d"], "value": [11, 20, 31, 42], "date": ["2017", "2018", "2018", "2017"], } def main(): df = pd.DataFrame(test_data) # 選取2017年的資料 data2017 = df[df["date"] == "2017"] print(data2017) # 選取value>30 的資料 data30 = df[df["value"] > 30] print(data30) if __name__ == "__main__": main()運行結果如下:
$ python test2.py name value date 0 a 11 2017 3 d 42 2017 name value date 2 c 31 2018 3 d 42 2017可以很方便的直接使用列名來過濾資料行
-
合并資料集
# -*- coding: utf-8 -*- import pandas as pd test_data_01 = { "name": ["a", "b", "c", "d"], "value": [11, 20, 31, 42], "date": ["2017", "2018", "2018", "2017"], } test_data_02 = { "name": ["a", "b", "c", "d"], "value": [31, 40, 51, 72], "date": ["2019", "2020", "2020", "2019"], } def main(): df01 = pd.DataFrame(test_data_01) df02 = pd.DataFrame(test_data_02) # 合并資料集時,設定 ignore_index = True,可以避免index重復 data = https://www.cnblogs.com/wang_yb/p/pd.concat([df01, df02], ignore_index=True) print(data) if __name__ =="__main__": main()運行結果如下:
$ python test2.py name value date 0 a 11 2017 1 b 20 2018 2 c 31 2018 3 d 42 2017 4 a 31 2019 5 b 40 2020 6 c 51 2020 7 d 72 2019如果不設定 ignore_index = True,執行結果如下:(注意第一列有重復)
$ python test2.py name value date 0 a 11 2017 1 b 20 2018 2 c 31 2018 3 d 42 2017 0 a 31 2019 1 b 40 2020 2 c 51 2020 3 d 72 2019
列操作
列操作我用到的場景,有一個是橫向統計各個列的合計和平均值,
示例如下:
# -*- coding: utf-8 -*-
import pandas as pd
test_data_01 = {
"a": [11, 20],
"b": [1, 2],
}
def main():
df = pd.DataFrame(test_data_01)
df["a+b"] = df["a"] + df["b"]
df["(a+b)/2"] = (df["a"] + df["b"]) / 2
print(df)
if __name__ == "__main__":
main()
運行結果如下:
$ python test2.py
a b a+b (a+b)/2
0 11 1 12 6.0
1 20 2 22 11.0
還有就是進行資料集的列合并,比如將多個資料集的統計結果進行合并:
# -*- coding: utf-8 -*-
import pandas as pd
test_data_01 = {
"a": [11, 20],
"b": [1, 2],
}
test_data_02 = {
"c": [18, 50],
"d": [31, 32],
}
def main():
df01 = pd.DataFrame(test_data_01)
df02 = pd.DataFrame(test_data_02)
df01["a+b"] = df01["a"] + df01["b"]
df01["(a+b)/2"] = (df01["a"] + df01["b"]) / 2
df01 = df01.drop(columns=["a", "b"])
df02["c+d"] = df02["c"] + df02["d"]
df02["(c+d)/2"] = (df02["c"] + df02["d"]) / 2
df02 = df02.drop(columns=["c", "d"])
df = pd.concat([df01, df02], axis=1)
print(df)
if __name__ == "__main__":
main()
運行結果如下:
$ python test2.py
a+b (a+b)/2 c+d (c+d)/2
0 12 6.0 49 24.5
1 22 11.0 82 41.0
行列互換
行列互換我一般是在做動態短視頻時使用的,把每個時間點一行資料(資料包含各個元素),變成每個元素在每個時間點一個資料,
開始時,資料類似:
date,a,b
2017,1,2
2018,2,3
轉換后變成:
key,date,value
a,2017,1
a,2018,2
b,2017,2
b,2018,3
轉換代碼:
# -*- coding: utf-8 -*-
import pandas as pd
test_data = https://www.cnblogs.com/wang_yb/p/{"date": ["2017", "2018"],
"a": [1, 2],
"b": [2, 3],
}
def main():
df = pd.DataFrame(test_data)
print("轉換前:>>>>>>")
print(df)
data = https://www.cnblogs.com/wang_yb/p/df.drop(columns=["date"])
data = https://www.cnblogs.com/wang_yb/p/pd.melt(data)
df_date = pd.concat([df["date"]] * 2, ignore_index=True)
data = https://www.cnblogs.com/wang_yb/p/pd.concat([df_date, data], axis=1)
print("\n轉換后:>>>>>>")
print(data)
if __name__ == "__main__":
main()
運行結果如下:
$ python test2.py
轉換前:>>>>>>
date a b
0 2017 1 2
1 2018 2 3
轉換后:>>>>>>
date variable value
0 2017 a 1
1 2018 a 2
2 2017 b 2
3 2018 b 3
匯出資料檔案
匯出檔案很簡單,只要指定個路徑即可(注意,路徑不存在會報錯),
data.to_csv("./test.csv")
匯出時,如果不想匯出每行資料的序號,加上 index=False
data.to_csv("./test.csv", index=False)
如果給標題行重新命名成易懂的中文名稱,設定 header 引數,
data.to_csv(
"./test.csv",
index=False,
header=[
"日期",
"名稱",
"時間(小時)",
],
)
總結
掌握了 pandas,感覺是多了一件隨便操作資料集的利器,能夠極大節省調整資料的時間,
而且,它的處理速度極快,我在自己的筆記本電腦上處理成千上萬條資料時基本都是瞬間完成,同樣的資料,我用 excel 來處理,會卡頓很多,
我的視頻號:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280606.html
標籤:Python
上一篇:Java后端知識體系
