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