日常數(shù)據(jù)分析任務(wù)中30個(gè)非常有用的Pandas函數(shù)

博文名稱:30 Very Useful Pandas Functions for Everyday Data Analysis Tasks
博文鏈接:https://towardsdatascience.com/30-very-useful-pandas-functions-for-everyday-data-analysis-tasks-f1eae16409af
發(fā)表時(shí)間:Jan 5, 2022


image.png

Python的Pandas庫(kù)是Python中使用最廣泛的庫(kù)技掏。因?yàn)檫@是數(shù)據(jù)分析或機(jī)器學(xué)習(xí)的各個(gè)方面所必需的數(shù)據(jù)操作庫(kù)缩功。即使你正在從事數(shù)據(jù)可視化或機(jī)器學(xué)習(xí),無(wú)論如何都會(huì)進(jìn)行一些數(shù)據(jù)操作梁肿。在本文中,我將列出日常使用所需的Pandas函數(shù)黑低,這些函數(shù)可以說(shuō)足以滿足常規(guī)的數(shù)據(jù)操作任務(wù)稽揭。

在本文中,我將使用Kaggle的一個(gè)公共數(shù)據(jù)集矛纹,稱為FIFA數(shù)據(jù)集。此處提到了用戶許可證光稼。

請(qǐng)隨時(shí)從此處下載數(shù)據(jù)集:

Datasets/fifa.csv at master · rashida048/Datasets

讓我們開始操作數(shù)據(jù)吧或南!

導(dǎo)入必要的包和數(shù)據(jù)集:

import numpy as np
import pandas as pd
pd.set_option('display.max_columns', 100)

讓我們開始討論以下函數(shù):

1. pd.read_csv, pd.read_excel

要提到的第一個(gè)函數(shù)是read_csv和read_excel。到現(xiàn)在為止钟哥,我在每個(gè)項(xiàng)目中都至少使用了其中一個(gè)功能迎献。這些功能已經(jīng)一目了然。它們用于將CSV或excel文件讀取為Pandas的DataFrame格式腻贰。這里我使用read_csv函數(shù)來(lái)讀取FIFA數(shù)據(jù)集:

df = pd.read_csv("fifa.csv")

有關(guān)read_csv函數(shù)的詳細(xì)視頻詳見以下鏈接吁恍。它有幾個(gè)很好的參數(shù),可以幫助你在讀取數(shù)據(jù)集時(shí)稍微清理一下數(shù)據(jù)集播演。我在這里有一篇詳細(xì)的文章:

Import CSV Files As Pandas DataFrame With skiprows, skipfooter, usecols, index_col, and header…

也可以使用 .read_csv() 函數(shù)執(zhí)行以下代碼讀取.txt文件:

data = pd.read_csv(file.txt, sep=" ")

如果你有一個(gè)excel文件而不是一個(gè)csv文件冀瓦,你將使用pd.read_excel。
在read_csv或read_excel之后使用.head()函數(shù)來(lái)查看數(shù)據(jù)框的數(shù)據(jù)写烤。默認(rèn)情況下翼闽,它顯示DataFrame的前5行。在這里洲炊,我展示了上面數(shù)據(jù)框df的前五行:

df.head()
image.png

如果你想要特定的行數(shù)而不是默認(rèn)的行數(shù)感局,你可以指定它。如果我想要7行暂衡,我會(huì)在.head()函數(shù)中傳入?yún)?shù)询微。

df.head(7)

2. df.columns

你有一個(gè)像這樣的大數(shù)據(jù)集時(shí),很難看到所有的列狂巢。使用.columns函數(shù)撑毛,你可以打印出數(shù)據(jù)集的所有列:

df.columns

輸出:

Index(['Unnamed: 0', 'sofifa_id', 'player_url', 'short_name', 'long_name', 'age', 'dob', 'height_cm', 'weight_kg', 'nationality', 'club_name', 'league_name', 'league_rank', 'overall', 'potential', 'value_eur', 'wage_eur', 'player_positions', 'preferred_foot', 'international_reputation', 'weak_foot', 'skill_moves', 'work_rate', 'body_type', 'real_face', 'release_clause_eur', 'player_tags', 'team_position', 'team_jersey_number', 'loaned_from', 'joined', 'contract_valid_until', 'nation_position', 'nation_jersey_number', 'pace', 'shooting', 'passing', 'dribbling', 'defending', 'physic', 'gk_diving', 'gk_handling', 'gk_kicking', 'gk_reflexes', 'gk_speed', 'gk_positioning', 'player_traits', 'attacking_crossing', 'attacking_finishing', 'attacking_heading_accuracy', 'attacking_short_passing', 'attacking_volleys', 'skill_dribbling', 'skill_curve', 'skill_fk_accuracy', 'skill_long_passing', 'skill_ball_control', 'movement_acceleration', 'movement_sprint_speed', 'movement_agility', 'movement_reactions', 'movement_balance', 'power_shot_power', 'power_jumping', 'power_stamina', 'power_strength', 'power_long_shots', 'mentality_aggression', 'mentality_interceptions', 'mentality_positioning', 'mentality_vision', 'mentality_penalties', 
'mentality_composure', 'defending_marking', 'defending_standing_tackle', 'defending_sliding_tackle', 'goalkeeping_diving', 'goalkeeping_handling', 'goalkeeping_kicking', 'goalkeeping_positioning', 'goalkeeping_reflexes'], dtype='object')

3. df.drop()

你可以使用df.drop()刪除一些不必要的列。在這個(gè)數(shù)據(jù)集中唧领,我們有很多列藻雌,我們?cè)诒窘坛讨胁粫?huì)使用所有列雌续。因此,我們可以輕松刪除一些:

df = df.drop(columns=['Unnamed: 0', 'weak_foot', 'real_face'])

我剛剛刪除了這三列:'Unnamed: 0'胯杭、'weak_foot'驯杜、'real_face'。

4. .len()

提供DataFrame的長(zhǎng)度做个。讓我們看一個(gè)例子:

len(df)

輸出:

16155

這個(gè)DataFrame有16155行數(shù)據(jù)艇肴。

5. df.query()

你可以使用布爾表達(dá)式進(jìn)行過濾或查詢。我將在此示例中使用“投籃”和“傳球”列叁温。在這里,我正在檢查哪些行 'shooting' 大于 'passing'核畴。

df.query("shooting > passing")

這將僅返回投籃大于傳球的行膝但。

6. df.iloc()

該函數(shù)將行和列索引作為參數(shù),并相應(yīng)地為你提供DataFrame的子集谤草。在這里跟束,我將提取前10行和列索引為5到10的數(shù)據(jù):

df.iloc[:10, 5:10]
image.png

7. df.loc()

該函數(shù)執(zhí)行的操作幾乎與 .iloc() 函數(shù)類似。但是在這里丑孩,我們可以準(zhǔn)確地指定我們想要的行索引以及列的名稱冀宴。下面是一個(gè)例子:

df.loc[[3, 10, 14, 23], ['nationality', 'weight_kg', "height_cm"]]
image.png

查看行索引,我們只提取第 3温学、10略贮、14和 23行。另外仗岖,對(duì)于列逃延,我們只有指定的列。

8. df[‘’].dtypes

另一個(gè)非吃簦基礎(chǔ)和廣泛使用的函數(shù)揽祥。因?yàn)樵谖覀兩钊敕治觥⒖梢暬蝾A(yù)測(cè)建模之前檩电,有必要了解變量的數(shù)據(jù)類型拄丰。我在這里使用 .dtypes函數(shù)獲取“height_cm”列的數(shù)據(jù)類型:

df.height_cm.dtypes

輸出:

dtype('int64')

你還可以選擇使用以下代碼獲取每一列的數(shù)據(jù)類型:

df.dtypes

輸出:

height_cm                     int64weight_kg                     int64nationality                  objectrandom_col                    int32club_name                    objectleague_name                  objectleague_rank                 float64overall                       int64potential                     int64value_eur                     int64wage_eur                      int64player_positions             objectpreferred_foot               objectinternational_reputation      int64skill_moves                   int64work_rate                    objectbody_type                    objectteam_position                objectteam_jersey_number          float64nation_position              objectnation_jersey_number        float64pace                        float64shooting                    float64passing                     float64dribbling                   float64defending                   float64physic                      float64cumsum_2                      int64rank_calc                   float64dtype: object

9. df.select_dtypes()

你可以使用此函數(shù)選擇特定數(shù)據(jù)類型的變量或列。例如俐末,我只想選擇數(shù)據(jù)類型為“int64”的列料按。以下是如何做到這一點(diǎn):

df.select_dtypes(include='int64')
image.png

我們得到了所有數(shù)據(jù)類型為“int64”的列。如果我們?cè)?'select_dtypes' 函數(shù)中使用 'exclude' 而不是 'include'鹅搪,我們將得到數(shù)據(jù)類型不是 'int64' 類型的列:

df.select_dtypes(exclude='int64')
image.png

這是輸出的一部分站绪。可以看到丽柿,輸出的變量不是整數(shù)恢准。但是魂挂,你可能認(rèn)為 'random_col' 列是整數(shù)。但是如果你檢查它的數(shù)據(jù)類型馁筐,你會(huì)發(fā)現(xiàn)它看起來(lái)是整數(shù)涂召,但實(shí)際它的數(shù)據(jù)類型是不同的。請(qǐng)隨時(shí)檢查敏沉。

10. df.insert()

顧名思義果正,它在指定位置插入一列。為了演示盟迟,我將首先創(chuàng)建一個(gè)跟我們數(shù)據(jù)框長(zhǎng)度相同的隨機(jī)數(shù)數(shù)組:

random_col = np.random.randint(100, size=len(df))

我將這個(gè)數(shù)組作為一列插入到數(shù)據(jù)框 df 的第 3 列位置秋泳。請(qǐng)記住,列索引從零開始攒菠。

df.insert(3, 'random_col', random_col)

查看數(shù)據(jù)框:

df.head()
image.png

可以看到迫皱, 'random_col' 列插入到第三列。

11. df[‘’].cumsum()

提供累計(jì)金額辖众。讓我用一個(gè)例子來(lái)解釋卓起。我將在此示例中使用“value_eur”和“wage_eur”列。下面是代碼:

df[['value_eur', 'wage_eur']].cumsum()

輸出:


image.png

正如你在每一行中看到的那樣凹炸,它為你提供前一行所有值的累積總和戏阅。

12. df.sample()

當(dāng)數(shù)據(jù)集太大時(shí),可以從中提取代表性樣本來(lái)執(zhí)行分析和預(yù)測(cè)建模啤它。這可能會(huì)節(jié)省你一些時(shí)間奕筐。此外,過多的數(shù)據(jù)有時(shí)可能會(huì)破壞可視化变骡。我們可以使用此函數(shù)來(lái)獲得一定數(shù)量的數(shù)據(jù)點(diǎn)或一定比例數(shù)據(jù)點(diǎn)救欧。在這里,我從FIFA數(shù)據(jù)集中抽取了200個(gè)數(shù)據(jù)點(diǎn)的樣本锣光。它需要隨機(jī)抽樣笆怠。

df.sample(n = 200)

我在這里使用 25% 的 FIFA 數(shù)據(jù)集:

df.sample(frac = 0.25)

13. df[‘’].where()

此函數(shù)可幫助你根據(jù)布爾條件查詢數(shù)據(jù)集。舉個(gè)例子誊爹,我們之前添加的random_col列數(shù)值范圍是0到100蹬刷。 下面是我們看看哪些值大于50。

df['random_col'].where(df['random_col'] > 50)

輸出:

0         NaN 
1         NaN 
2        56.0 
3         NaN 
4         NaN 
         ...  
16150    65.0 
16151     NaN 
16152     NaN 
16153    57.0 
16154     NaN 
Name: random_col, Length: 16155, dtype: float64

可以看到频丘,如果值不滿足不大于 50 的條件办成,則返回 NaN。我們可以使用以下代碼將NaN替換為0或任何其他值:

df['random_col'].where(df['random_col'] > 50, 0)

輸出:

0         0 
1         0 
2        56 
3         0 
4         0 
         .. 
16150    65 
16151     0 
16152     0 
16153    57 
16154     0 
Name: random_col, Length: 16155, dtype: int32

14. df[‘’].unique()

這對(duì)分類變量非常有用搂漠。它用于查找分類列的唯一值迂卢。讓我們看看FIFA數(shù)據(jù)集中“skill_moves”列的唯一值是什么:

df.skill_moves.unique()

輸出:

array([4, 5, 1, 3, 2], dtype=int64)

可以看到,Skill_moves列有五個(gè)唯一值。如果我們打印出數(shù)據(jù)集的頭部來(lái)檢查列的值而克,可能看不到其中的所有唯一值靶壮。所以,要知道所有的唯一值员萍, .unique()函數(shù)真的很方便腾降。

15. df[‘’].nunique()

另一個(gè)主流的函數(shù)。此函數(shù)可讓你知道一列中有多少個(gè)唯一值碎绎。例如螃壤,如果你想查看此數(shù)據(jù)集中有多少不同的國(guó)籍,可以使用這行簡(jiǎn)單的代碼:

df.nationality.nunique()

輸出:

149

很棒的一點(diǎn)是筋帖,這個(gè)函數(shù)也可以用于整個(gè)數(shù)據(jù)集奸晴,以了解每列中唯一值的數(shù)量:

df.nunique()

輸出:

height_cm                      48 
weight_kg                      54 
nationality                   149 
random_col                    100 
club_name                     577 
league_name                    37 
league_rank                     4 
overall                        53 
potential                      49 
value_eur                     161 
wage_eur                       41 
player_positions              907 
preferred_foot                  2 
international_reputation        5 
skill_moves                     5 
work_rate                       9 
body_type                       3 
team_position                  29 
team_jersey_number             99 
nation_position                28 
nation_jersey_number           26 
pace                           74 
shooting                       70 
passing                        67 
dribbling                      67 
defending                      69 
physic                         63 
cumsum_2                    14859 
rank_calc                     161 
dtype: int64

上面我們得到每列中唯一值的數(shù)目。

16. df[‘’].rank()

該函數(shù)為你提供基于特定列的排名日麸。在 FIFA 數(shù)據(jù)集中蚁滋,如果我們想根據(jù) ‘value_eur’ 列對(duì)球員進(jìn)行排名,代碼如下:

df['rank_calc'] = df["value_eur"].rank()

使用上面的代碼赘淮,創(chuàng)建了一個(gè)名為“rank_calc”的新列。這個(gè)新列將根據(jù)“value_eur”為你提供每個(gè)運(yùn)動(dòng)員的排名睦霎。默認(rèn)情況下梢卸,該列將添加到最后。請(qǐng)自行運(yùn)行該行代碼進(jìn)行檢查副女。

17. .isin()

我將使用 .isin() 函數(shù)提取僅包含少數(shù)國(guó)籍的運(yùn)動(dòng)員的數(shù)據(jù)集子集蛤高。

nationality = ["Argentina", "Portugal", "Sweden", "England"] 
df[df.nationality.isin(nationality)]

運(yùn)行這段代碼,你將看到我們得到的數(shù)據(jù)集只包含上面列表中提到的幾個(gè)國(guó)家碑幅〈鞫福可以在此處看到提取的子集:


image.png

18. df.replace()

replace函數(shù)將替換列的值。當(dāng)我們只需要替換列的一個(gè)唯一值時(shí)沟涨,我們只需要傳遞舊值和新值⌒襞現(xiàn)在,我們將“l(fā)eague_rank”1.0替換成1.1裹赴。

df.replace(1.0, 1.1)
image.png

現(xiàn)在看數(shù)據(jù)集中的League_rank列喜庞,1.0 被1.1取代。如果我們需要更改多個(gè)值棋返,我們可以通過字典傳遞給替換函數(shù)延都,其中鍵應(yīng)該是原始值,值應(yīng)該是替換值睛竣。

df.replace({1.0: 1.1,  4.0: 4.1, 3.0: 3.1})
image.png

19. df.rename()

它用于對(duì)表的列重命名晰房。在此,我將“weight_kg”和“height_cm”列更改為Weight (kg)”和“Height (cm)”:

df.rename(columns = {"weight_kg": "Weight (kg)", "height_cm": "Height (cm)"})
image.png

非常簡(jiǎn)單有用!

20. .fillna()

每當(dāng)你在現(xiàn)實(shí)生活中收到一個(gè)大數(shù)據(jù)集時(shí)殊者,在大多數(shù)情況下与境,都會(huì)有一些空值。得到一個(gè)完美的數(shù)據(jù)集很難幽污。因此嚷辅,如果你是數(shù)據(jù)分析師或數(shù)據(jù)科學(xué)家,空值填補(bǔ)是你日常任務(wù)的一部分距误。此函數(shù) .fillna() 用你選擇的其他值替換空值簸搞。以下是FIFA數(shù)據(jù)集末尾的一些列:


image.png

可以看到,在投籃准潭、傳球趁俊、防守和其他一些列中有一些空值。在開始進(jìn)行任何預(yù)測(cè)建模和其他一些數(shù)據(jù)科學(xué)任務(wù)之前刑然,我們確實(shí)需要用一些兼容數(shù)據(jù)類型的值替換這些空值寺擂。否則,我們可能會(huì)出錯(cuò)泼掠。例如怔软,在‘pace’列中,值應(yīng)該是數(shù)字择镇,但你會(huì)看到NaN值挡逼。最通用但不是那么有效的方法是用零值替換這些NaN值。

df['pace'].fillna(0, inplace=True)
image.png

你會(huì)注意到腻豌,現(xiàn)在“pace”列中的NaN轉(zhuǎn)為零家坎。在“total pace”列中,如果有更多NaN值吝梅,它們也應(yīng)該用零替換虱疏。
正如我之前提到的,用零替換可能不是最有效的方法苏携。你可以將其替換為您選擇的其他一些值做瞪。用平均值或中位數(shù)替換值也很常見。

df['pace'].fillna(df['pace'].mean(), inplace = True)

21. df.groupby()

這是最主流的數(shù)據(jù)匯總函數(shù)右冻〈┌猓可以根據(jù)某個(gè)變量對(duì)數(shù)據(jù)進(jìn)行分組,并找出有關(guān)這些組的有用信息国旷。例如矛物,這里按國(guó)籍對(duì)數(shù)據(jù)進(jìn)行分組并計(jì)算每個(gè)國(guó)籍的總“value_eur”:

df.groupby("nationality")['value_eur'].sum()

輸出:

nationality
Albania                25860000
Algeria                70560000
Angola                  6070000
Antigua & Barbuda       1450000
Argentina            1281372000
                        ...    
Uzbekistan              7495000
Venezuela              41495000
Wales                 113340000
Zambia                  4375000
Zimbabwe                6000000
Name: value_eur, Length: 149, dtype: int64

阿爾巴尼亞所有球員的'value_eur'總和為25860000。
也可以按多個(gè)變量分組并使用多個(gè)聚合函數(shù)跪但。我們將看到每個(gè)國(guó)籍和每個(gè)聯(lián)賽排名的均值_eur履羞、中值_eur峦萎、均值工資_eur和中值工資_eur。

df.groupby(['nationality', 'league_rank'])['value_eur', 'wage_eur'].agg([np.mean, np.median])

輸出:


image.png

可以使用“group by”函數(shù)執(zhí)行更多操作忆首。我在這里有一篇詳細(xì)的文章:

Efficient Data Summarizing and Analysis Using Pandas’ Groupby Function

22. .pct_change()

你可以計(jì)算變量較先前值的變化百分比爱榔。在本演示中,我將使用 value_eur列并獲取每行數(shù)據(jù)相對(duì)于前一列的百分比變化糙及。第一行將是NaN详幽,因?yàn)橹皼]有要比較的值。

df.value_eur.pct_change()

輸出:

0             NaN 
1       -0.213930 
2       -0.310127 
3       -0.036697 
4        0.209524 
           ...    
16150    0.000000 
16151    0.500000 
16152   -0.500000 
16153    0.000000 
16154   -1.000000 
Name: value_eur, Length: 16155, dtype: float64

在這個(gè)數(shù)據(jù)集中浸锨,你可能不覺得這很重要唇聘。
但想想一些財(cái)務(wù)數(shù)據(jù)。特別是當(dāng)您每天擁有股票市場(chǎng)價(jià)值時(shí)柱搜〕倮桑看到每天價(jià)值的百分比變化該有多好。

23. df.count()

它為你提供數(shù)據(jù)框中指定方向的數(shù)據(jù)數(shù)量聪蘸。當(dāng)方向?yàn)?時(shí)宪肖,它提供數(shù)據(jù)框列的數(shù)據(jù)數(shù)目:

df.count(0)

輸出:

Unnamed: 0                 16155 
sofifa_id                  16155 
player_url                 16155 
short_name                 16155 
long_name                  16155 
                           ...   
goalkeeping_diving         16155 
goalkeeping_handling       16155 
goalkeeping_kicking        16155 
goalkeeping_positioning    16155 
goalkeeping_reflexes       16155 
Length: 81, dtype: int64

你可以看到每列中的數(shù)據(jù)數(shù)量。
當(dāng)方向?yàn)?時(shí)健爬,它提供行中的數(shù)據(jù)數(shù):

df.count(1)

輸出:

0        72 
1        72 
2        72 
3        72 
4        71 
         .. 
16150    68 
16151    68 
16152    68 
16153    68 
16154    69 
Length: 16155, dtype: int64

每一行的數(shù)據(jù)數(shù)量不同控乾。如果你仔細(xì)觀察數(shù)據(jù)集,你會(huì)發(fā)現(xiàn)它在幾列中有很多空值娜遵。

24. df[‘’].value_counts()

我們可以使用此函數(shù)獲取每個(gè)類別的值計(jì)數(shù)蜕衡。在這里,我得到了每個(gè)League_rank中有多少個(gè)值魔熏。

df['league_rank'].value_counts()

輸出:

1.0    11738 
2.0     2936 
3.0      639 
4.0      603 
Name: league_rank, dtype: int64

它返回默認(rèn)排序的結(jié)果。如果你希望結(jié)果按升序排列鸽扁,只需設(shè)置升序 = True:

df['league_rank'].value_counts(ascending=True)

輸出:

4.0      603 
3.0      639 
2.0     2936 
1.0    11738 
Name: league_rank, dtype: int64

25. pd.crosstab()

它提供了一個(gè)頻率表蒜绽,它是兩個(gè)變量的交叉表。我在這里制作了 League_rank 和 international_reputation 的交叉表:

pd.crosstab(df['league_rank'], df['international_reputation'])
image.png

所以桶现,我們得到了League_rank和international_reputation所有組合的數(shù)量躲雅。我們可以看到大多數(shù)球員的international_reputation 和 League_rank都為 1。
可以進(jìn)一步改進(jìn)骡和。我們可以在兩個(gè)方向上添加累計(jì)值相赁,必要時(shí)還可以獲得標(biāo)準(zhǔn)化值:

pd.crosstab(df['league_rank'], df['international_reputation'],  
            margins = True, 
            margins_name="Total", 
            normalize = True)
image.png

下面是關(guān)于 count、value_counts 和 crosstab 方法的詳細(xì)教程:

Three Very Useful Functions of Pandas to Summarize the Data

26. pd.qcut()

該函數(shù)根據(jù)數(shù)據(jù)的分布對(duì)數(shù)據(jù)進(jìn)行分箱或分段慰于。所以钮科,我們得到了每個(gè)球員的分組。在這里婆赠,我將 value_eur分為5個(gè)部分绵脯,并獲取哪個(gè)球員屬于哪個(gè)部分:

pd.qcut(df['value_eur'], q = 5)

輸出:

0        (1100000.0, 100500000.0] 
1        (1100000.0, 100500000.0] 
2        (1100000.0, 100500000.0] 
3        (1100000.0, 100500000.0] 
4        (1100000.0, 100500000.0] 
                   ...            
16150          (-0.001, 100000.0] 
16151          (-0.001, 100000.0] 
16152          (-0.001, 100000.0] 
16153          (-0.001, 100000.0] 
16154          (-0.001, 100000.0] 
Name: value_eur, Length: 16155, dtype: category 
Categories (5, interval[float64]): [(-0.001, 100000.0] < (100000.0, 230000.0] < (230000.0, 500000.0] < (500000.0, 1100000.0] < (1100000.0, 100500000.0]]

您可以使用上述代碼行中的 value_counts 來(lái)查看球員如何落入哪個(gè)范圍:

pd.qcut(df['value_eur'], q = 5).value_counts()

輸出:

(-0.001, 100000.0]          3462 
(230000.0, 500000.0]        3305 
(100000.0, 230000.0]        3184 
(500000.0, 1100000.0]       3154 
(1100000.0, 100500000.0]    3050 
Name: value_eur, dtype: int64

如你所見,數(shù)字非常接近。默認(rèn)情況下蛆挫,qcut嘗試將它們平均劃分赃承。但在現(xiàn)實(shí)生活中,它并不希望總是平等悴侵。因?yàn)榇蠖鄶?shù)時(shí)候分布并不均勻瞧剖。

27. pd.cut()

分檔的另一種方法。如果我們想使用cut制作5個(gè)bin可免,它會(huì)將整個(gè)value_eur范圍分成相等的五個(gè)部分抓于,每個(gè) bin 中的數(shù)目將相應(yīng)地跟隨。

pd.cut(df['value_eur'], bins = 5).value_counts()

輸出:

(-100500.0, 20100000.0]      16102  
(20100000.0, 40200000.0]        40  
(40200000.0, 60300000.0]        10  
(60300000.0, 80400000.0]         2  
(80400000.0, 100500000.0]        1  
Name: value_eur, dtype: int64

每個(gè)區(qū)間的區(qū)間相等巴元,但是每個(gè)分組的數(shù)目是非常不同的毡咏。

我有一篇關(guān)于使用 cut 和 qcut 方法進(jìn)行數(shù)據(jù)分箱的詳細(xì)文章。請(qǐng)隨意查看:

Data Binning with Pandas Cut or Qcut Method

28. df[‘’].describe()

這是一個(gè)很好的函數(shù)逮刨,它提供了一些基本的統(tǒng)計(jì)度量呕缭。我在這里使用了wage_eur 列上的describe 函數(shù):

df['wage_eur'].describe()

輸出:

count     16155.000000 
mean      13056.453110 
std       23488.182571 
min           0.000000 
25%        2000.000000 
50%        5000.000000 
75%       10000.000000 
max      550000.000000 
Name: wage_eur, dtype: float64

如輸出所示,我們有八種不同的度量修己。它們中的每一個(gè)都非常重要恢总。

29. nlargest and nsmallest

這為你提供了具有指定變量的n個(gè)最大值或最小值的數(shù)據(jù)集。例如睬愤,我想獲取前5位工資的行:

df.nlargest(5, "wage_eur")
image.png

以同樣的方式片仿,我可以用5個(gè)最小的wage_eur數(shù)據(jù)制作數(shù)據(jù)集的子集:

df.nsmallest(5, "wage_eur")
image.png

30. df.explode()

當(dāng)某些行中有數(shù)據(jù)列表時(shí),分解會(huì)很有用尤辱。當(dāng)某些列中有整數(shù)而某些列中有列表時(shí)砂豌,很難分析、可視化或執(zhí)行某些預(yù)測(cè)建模光督。Explode函數(shù)有助于分解這些列表阳距。例如,看看這個(gè)數(shù)據(jù)框:

將dataframe按照某一指定列進(jìn)行展開结借,使得原來(lái)的每一行展開成一行或多行筐摘。

df1 = pd.DataFrame({"city": ['A', 'B', 'C'], 
                   "day1": [22, 25, 21], 
                   'day2':[31, 12, 67], 
                   'day3': [27, 20, 15], 
                   'day4': [34, 37, [41, 45, 67, 90, 21]], 
                   'day5': [23, 54, 36]}) 
df1
image.png

讓我們擴(kuò)展d4列:

df1.explode(jupyter notebook'day4').reset_index(drop=True)
image.png

結(jié)論

Python的panda的庫(kù)很強(qiáng)大,有這么多功能船老。我在日常生活中選擇了一些重要的功能咖熟。如果你非常了解這些,你將能夠成功執(zhí)行大多數(shù)分析任務(wù)柳畔。Panda還有一個(gè)非常有用的函數(shù)馍管,我在這里沒有提到,那就是 .plot() 函數(shù)薪韩。你通過pandas就可繪圖咽斧。Pandas在后端使用Matplotlib并為你返回繪圖堪置。我在這里有一個(gè)詳細(xì)的教程:

An Ultimate Cheat Sheet for Data Visualization in Pandas

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市张惹,隨后出現(xiàn)的幾起案子舀锨,更是在濱河造成了極大的恐慌,老刑警劉巖宛逗,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坎匿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雷激,警方通過查閱死者的電腦和手機(jī)替蔬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屎暇,“玉大人承桥,你說(shuō)我怎么就攤上這事「浚” “怎么了凶异?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挤巡。 經(jīng)常有香客問我剩彬,道長(zhǎng),這世上最難降的妖魔是什么矿卑? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任喉恋,我火速辦了婚禮,結(jié)果婚禮上母廷,老公的妹妹穿的比我還像新娘轻黑。我一直安慰自己,他們只是感情好琴昆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布氓鄙。 她就那樣靜靜地躺著,像睡著了一般椎咧。 火紅的嫁衣襯著肌膚如雪玖详。 梳的紋絲不亂的頭發(fā)上把介,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天勤讽,我揣著相機(jī)與錄音,去河邊找鬼拗踢。 笑死脚牍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巢墅。 我是一名探鬼主播诸狭,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼券膀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驯遇?” 一聲冷哼從身側(cè)響起芹彬,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叉庐,沒想到半個(gè)月后舒帮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陡叠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年玩郊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枉阵。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡译红,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兴溜,到底是詐尸還是另有隱情侦厚,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布昵慌,位于F島的核電站假夺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斋攀。R本人自食惡果不足惜已卷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淳蔼。 院中可真熱鬧侧蘸,春花似錦、人聲如沸鹉梨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)存皂。三九已至晌坤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旦袋,已是汗流浹背骤菠。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疤孕,地道東北人商乎。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祭阀,于是被迫代替她去往敵國(guó)和親鹉戚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲜戒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345