【Python】图解Pandas的宝藏函数:assign
公眾號:尤而小屋
作者:Peter
編輯:Peter
在我們處理數據的時候,有時需要根據某個列進行計算得到一個新列,以便后續使用,相當于是根據已知列得到新的列,這個時候assign函數非常方便。下面通過實例來說明函數的的用法。
Pandas文章
本文是Pandas文章連載系列的第21篇,主要分為3類:
1、基礎部分:1-16篇,主要是介紹Pandas中基礎和常用操作,比如數據創建、檢索查詢、排名排序、缺失值/重復值處理等常見的數據處理操作
2、進階部分:第17篇開始講解Pandas中的高級操作方法
3、對比SQL,學習Pandas:將SQL和Pandas的操作對比起來進行學習
參數
assign函數的參數只有一個:DataFrame.assign(**kwargs)。
**kwargs:?dict?of?{str:?callable?or?Series}關于參數的幾點說明:
列名是關鍵字keywords
如果列名是可調用的,那么它們將在DataFrame上計算并分配給新的列
如果列名是不可調用的(例如:Series、標量scalar或者數組array),則直接進行分配
最后,這個函數的返回值是一個新的DataFrame數據框,包含所有現有列和新生成的列
導入庫
import?pandas?as?pd import?numpy?as?np#?模擬數據df?=?pd.DataFrame({"col1":[12,?16,?18],"col2":["xiaoming","peter",?"mike"]})df| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
實例
當值是可調用的,我們直接在數據框上進行計算:
方式1:直接調用數據框
#?方式1:數據框df上調用 #?使用數據框df的col1屬性,生成col3df.assign(col3=lambda?x:?x.col1?/?2?+?20)| 12 | xiaoming | 26.0 |
| 16 | peter | 28.0 |
| 18 | mike | 29.0 |
我們可以查看原來的df,發現它是不變的
df??#?原數據框不變的| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
操作字符串類型的數據:
df.assign(col3=df["col2"].str.upper())方式2:調用Series數據
可以通過直接引用現有的Series或序列來實現相同的行為:
#?方式2:調用現有的Series來計算df.assign(col4=df["col1"]?*?3?/?4?+?25)df??#?原數據不變| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
在Python3.6+中,我們可以在同一個賦值中創建多個列,并且其中一個列還可以依賴于同一個賦值中定義的另一列,也就是中間生成的新列可以直接使用:
df.assign(col5=lambda?x:?x["col1"]?/?2?+?10,?????????col6=lambda?x:?x["col5"]?*?5,??#?在col6計算中直接使用col5????????col7=lambda?x:?x.col2.str.upper(),?????????col8=lambda?x:?x.col7.str.title()??#?col8中使用col7 )df???#?原數據不變| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
如果我們重新分配的是一個現有的列,那么這個現有列的值將會被覆蓋:
df.assign(col1=df["col1"]?/?2)??#?col1直接被覆蓋| 6.0 | xiaoming |
| 8.0 | peter |
| 9.0 | mike |
對比apply函數
我們在pandas中同樣可以使用apply函數來實現
df??#?原數據| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
生成一個副本,我們直接在副本上操作:
df1?=?df.copy()??#?生成副本,直接在副本上操作 df2?=?df.copy()df1| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
| 12 | xiaoming | 26.0 |
| 16 | peter | 28.0 |
| 18 | mike | 29.0 |
| 12 | xiaoming |
| 16 | peter |
| 18 | mike |
| 12 | xiaoming | 26.0 |
| 16 | peter | 28.0 |
| 18 | mike | 29.0 |
我們發現:通過assign函數的操作,原數據是不變的,但是通過apply操作的數據已經變化了
BMI指數
最后在模擬一份數據,計算每個人的BMI指數。
身體質量指數,是BMI指數,簡稱體質指數,是國際上常用的衡量人體胖瘦程度以及是否健康的一個標準。
體重身高
其中:體重單位是kg,身高單位是m
df2?=?pd.DataFrame({"name":["xiaoming","xiaohong","xiaosu"],"weight":[78,65,87],"height":[1.82,1.75,1.89] })df2| xiaoming | 78 | 1.82 |
| xiaohong | 65 | 1.75 |
| xiaosu | 87 | 1.89 |
| xiaoming | 78 | 1.82 |
| xiaohong | 65 | 1.75 |
| xiaosu | 87 | 1.89 |
總結
通過上面的例子,我們發現:
使用assign函數生成的DataFrame是不會改變原來的數據,這個DataFrame是新的
assign函數能夠同時操作多個列名,并且中間生成的列名能夠直接使用
assign和apply的主要區別在于:前者不改變原數據,apply函數是在原數據的基礎上添加新列
本站qq群851320808,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【Python】图解Pandas的宝藏函数:assign的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】与机器学习算法公式相关的数学
- 下一篇: Windows平台RTMP直播推送集成简