網(wǎng)站首頁 編程語言 正文
導入模塊與讀取數(shù)據(jù)
我們第一步需要導入模塊以及數(shù)據(jù)集
import pandas as pd df = pd.read_csv("IMDB-Movie-Data.csv") df.head()
創(chuàng)建新的列
一般我們是通過在現(xiàn)有兩列的基礎(chǔ)上進行一些簡單的數(shù)學運算來創(chuàng)建新的一列,例如
df['AvgRating'] = (df['Rating'] + df['Metascore']/10)/2
但是如果要新創(chuàng)建的列是經(jīng)過相當復雜的計算得來的,那么lambda
方法就很多必要被運用到了,我們先來定義一個函數(shù)方法
def custom_rating(genre,rating): if 'Thriller' in genre: return min(10,rating+1) elif 'Comedy' in genre: return max(0,rating-1) elif 'Drama' in genre: return max(5, rating-1) else: return rating
我們對于不同類別的電影采用了不同方式的評分方法,例如對于“驚悚片”,評分的方法則是在“原來的評分+1”和10分當中取一個最小的,而對于“喜劇”類別的電影,則是在0分和“原來的評分-1”當中取一個最大的,然后我們通過apply
方法和lambda
方法將這個自定義的函數(shù)應(yīng)用在這個DataFrame
數(shù)據(jù)集當中
df["CustomRating"] = df.apply(lambda x: custom_rating(x['Genre'], x['Rating']), axis = 1)
我們這里需要說明一下axis
參數(shù)的作用,其中axis=1
代表跨列而axis=0
代表跨行,如下圖所示
篩選數(shù)據(jù)
在pandas
當中篩選數(shù)據(jù)相對來說比較容易,可以用到& | ~
這些操作符,代碼如下
# 單個條件,評分大于5分的 df_gt_5 = df[df['Rating']>5] # 多個條件: AND - 同時滿足評分高于5分并且投票大于100000的 And_df = df[(df['Rating']>5) & (df['Votes']>100000)] # 多個條件: OR - 滿足評分高于5分或者投票大于100000的 Or_df = df[(df['Rating']>5) | (df['Votes']>100000)] # 多個條件:NOT - 將滿足評分高于5分或者投票大于100000的數(shù)據(jù)排除掉 Not_df = df[~((df['Rating']>5) | (df['Votes']>100000))]
這些都是非常簡單并且是常見的例子,但是要是我們想要篩選出電影的影名長度大于5
的部分,要是也采用上面的方式就會報錯
df[len(df['Title'].split(" "))>=5]
output
AttributeError: 'Series' object has no attribute 'split'
這里我們還是采用apply
和lambda
相結(jié)合,來實現(xiàn)上面的功能
#創(chuàng)建一個新的列來存儲每一影片名的長度 df['num_words_title'] = df.apply(lambda x : len(x['Title'].split(" ")),axis=1) #篩選出影片名長度大于5的部分 new_df = df[df['num_words_title']>=5]
當然要是大家覺得上面的方法有點繁瑣的話,也可以一步到位
new_df = df[df.apply(lambda x : len(x['Title'].split(" "))>=5,axis=1)]
例如我們想要篩選出那些影片的票房低于當年平均水平的數(shù)據(jù),可以這么來做。
我們先要對每年票房的的平均值做一個歸總,代碼如下
year_revenue_dict = df.groupby(['Year']).agg({'Revenue(Millions)':np.mean}).to_dict()['Revenue(Millions)']
然后我們定義一個函數(shù)來判斷是否存在該影片的票房低于當年平均水平的情況,返回的是布爾值
def bool_provider(revenue, year): return revenue<year_revenue_dict[year]
然后我們通過結(jié)合apply
方法和lambda
方法應(yīng)用到數(shù)據(jù)集當中去
new_df = df[df.apply(lambda x : bool_provider(x['Revenue(Millions)'],x['Year']),axis=1)]
我們篩選數(shù)據(jù)的時候,主要是用.loc
方法,它同時也可以和lambda
方法聯(lián)用,例如我們想要篩選出評分在5-8分之間的電影以及它們的票房,代碼如下
df.loc[lambda x: (x["Rating"] > 5) & (x["Rating"] < 8)][["Title", "Revenue (Millions)"]]
轉(zhuǎn)變指定列的數(shù)據(jù)類型
通常我們轉(zhuǎn)變指定列的數(shù)據(jù)類型,都是調(diào)用astype
方法來實現(xiàn)的,例如我們將“Price”這一列的數(shù)據(jù)類型轉(zhuǎn)變成整型的數(shù)據(jù),代碼如下
df['Price'].astype('int')
會出現(xiàn)如下所示的報錯信息
ValueError: invalid literal for int() with base 10: '12,000'
因此當出現(xiàn)類似“12,000”的數(shù)據(jù)的時候,調(diào)用astype
方法實現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換就會報錯,因此我們還需要將到apply
和lambda
結(jié)合進行數(shù)據(jù)的清洗,代碼如下
df['Price'] = df.apply(lambda x: int(x['Price'].replace(',', '')),axis=1)
方法調(diào)用過程的可視化
有時候我們在處理數(shù)據(jù)集比較大的時候,調(diào)用函數(shù)方法需要比較長的時間,這個時候就需要有一個要是有一個進度條,時時刻刻向我們展示數(shù)據(jù)處理的進度,就會直觀很多了。
這里用到的是tqdm
模塊,我們將其導入進來
from tqdm import tqdm, tqdm_notebook tqdm_notebook().pandas()
然后將apply
方法替換成progress_apply
即可,代碼如下
df["CustomRating"] = df.progress_apply(lambda x: custom_rating(x['Genre'],x['Rating']),axis=1)
output
當lambda方法遇到if-else
當然我們也可以將if-else
運用在lambda
自定義函數(shù)當中,代碼如下
Bigger = lambda x, y : x if(x > y) else y Bigger(2, 10)
output
10
當然很多時候我們可能有多組if-else
,這樣寫起來就有點麻煩了,代碼如下
df['Rating'].apply(lambda x:"低分電影" if x < 3 else ("中等電影" if x>=3 and x < 5 else("高分電影" if x>=8 else "值得觀看")))
看上去稍微有點凌亂了,這個時候,小編這里到還是推薦大家自定義函數(shù),然后通過apply
和lambda
方法搭配使用。
原文鏈接:https://blog.csdn.net/weixin_38037405/article/details/122150299
相關(guān)推薦
- 2023-02-14 教你使用SQL語句進行數(shù)據(jù)庫復雜查詢_MsSql
- 2022-08-22 Python基礎(chǔ)異常處理梳理總結(jié)_python
- 2022-12-25 pycharm導入第三方庫的兩種方法(永不報錯)_python
- 2022-12-02 解析Golang中的鎖競爭問題_Golang
- 2022-09-21 Android開發(fā)之AAR文件的生成與使用步驟_Android
- 2022-02-25 FastDFS 端口映射問題,---spring改變jar包中bean方法邏輯的另一種特殊方式
- 2022-12-26 C語言逆向分析語法超詳細分析_C 語言
- 2022-08-30 C語言中定義與聲明有哪些區(qū)別_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支