【Python基礎】Pandas筆記---通過比賽整理出的10條Pandas實用技巧
點擊上方“潛心的Python小屋”關注我們,第一時間推送優(yōu)質(zhì)文章。
前言
大家好,我是潛心。最近還在參加某比賽,將pandas對數(shù)據(jù)預處理的方法進行了總結(jié),以下列出的10條是我覺得比較常用、好用的處理操作。
本文約3k字,預計閱讀15分鐘。
1. 連接Pandas對象---concat()
concat方法是沿著某條軸,將多個DataFrame/Series對象進行連接在一起。
主要用途:?對某些對象只進行簡單的行連接或列連接。
def?concat(objs,?axis=0,?join="outer",?ignore_index:?bool?=?False,?keys=None,?levels=None,?names=None,?verify_integrity:?bool?=?False,?copy:?bool?=?True)?
主要參數(shù)介紹:
objs:多個對象; axis:指定連接的軸,0(行)或1(列); join:連接的方式,outer(外連接)或inter(內(nèi)連接); ingnore_index:是否重建索引;
例:
In[1]:?df1?=?pd.DataFrame(np.random.randint(10,?size=(3,?3)),?columns=['A',?'B',?'C'])
??
?A?B?C
0?1?4?8
1?8?8?4
2?0?9?3
In[2]:?df2?=?pd.DataFrame(np.random.randint(10,?size=(2,?2)),?columns=['A',?'B'])
?A?B
0?3?9
1?8?6
In[3]:?pd.concat([df1,?df2],?axis=0,?join='outer')
?A?B?C
0?1?4?8.0
1?8?8?4.0
2?0?9?3.0
0?3?9?NaN
1?8?6?NaN
In[4]:?pd.concat([df1,?df2],?axis=0,?join='inner',?ignore_index=True)
?A?B
0?1?4
1?8?8
2?0?9
3?3?9
4?8?6
In[5]:?pd.concat([df1,?df2],?axis=1,?join='outer')
?A?B?C?A?B
0?1?4?8?3.0?9.0
1?8?8?4?8.0?6.0
2?0?9?3?NaN?NaN
2. 合并Pandas對象---merge()
類似于關系數(shù)據(jù)庫的連接方式,根據(jù)一個或多個鍵(即列)將不同的DataFrame連接起來。
主要用途:對于擁有相同的鍵的兩個DataFrame對象,需要將其進行有效的拼接,整合到一個對象。
def?merge(left,?right,?how='inner',?on=None,?left_on=None,?right_on=None,
?????????left_index=False,?right_index=False,?sort=True,
?????????suffixes=('_x',?'_y'),?copy=True,?indicator=False,
?????????validate=None)
主要參數(shù)介紹:
left:DataFrame對象; right:DataFrame對象; how:連接方式,inner或outer; on:指定用于連接的鍵,必須存在于左右兩個DataFrame中; left_on:左側(cè)DataFrame中用于連接鍵的列名,當左右對象列名不同但含義相同時使用; right_on:右側(cè)DataFrame中用于連接鍵的列名; left_index:使用左側(cè)DataFrame的行索引作為連接鍵(配合right_on); right_index:使用右側(cè)DataFrame的行索引作為連接鍵(配合left_on); sort:對其按照連接鍵進行排序;
例:
In[6]:?pd.merge(df1,?df2,?how='inner',?on='A')
?A?B_x?C?B_y
0?8?8?4?6
In[7]:?pd.merge(df1,?df2,?how='outer',?on='B')
??
?A_x?B?C?A_y
0?1.0?4?8.0?NaN
1?8.0?8?4.0?NaN
2?0.0?9?3.0?3.0
3?NaN?6?NaN?8.0
In[8]:?pd.merge(df1,?df2,?how='outer',?left_on='B',?right_on='A')
??
???A_x?B_x?C?A_y?B_y
0?1.0?4.0?8.0?NaN?NaN
1?8.0?8.0?4.0?8.0?6.0
2?0.0?9.0?3.0?NaN?NaN
3?NaN?NaN?NaN?3.0?9.0
3. 刪除重復項---drop_duplicates()
刪除對象DataFrame中重復的行,重復通過參數(shù)subset指定。
主要用途:統(tǒng)計對象中不重復的個數(shù);
def?drop_duplicates(subset=None,?keep='first',?inplace=False,?ignore_index=False)
主要參數(shù)介紹:
subset:指定的鍵(列),默認為所有的列(即每行全部相同); keep:刪除重復項,除了第1個(first)或者最后一個(last); inplace:是否直接對原來的對象進行修改,默認為False,生成一個拷貝; ignore_index:是否重建索引;
例:
df1
?A?B?C
0?3?2?4
1?6?4?2
2?3?4?3
3?3?7?0
4?5?1?6
5?6?1?4
In[9]:?df1.drop_duplicates('A')
?A?B?C
0?3?2?4
1?6?4?2
4?5?1?6
4. Series中的去重---unique()
相比于drop_duplicates方法,unique()只針對于Series對象,類似于Set。
主要用途:?通常是對DataFrame中提取某一鍵,變成Series,再去重,統(tǒng)計個數(shù)。
Series.unique()
例:
In[10]:?len(df1['A'].unique().tolist())
3
5. 排序---sort_values()
按照某個鍵進行排序。
主要用途:查看相同鍵時行的某些變化,如例子中在A相同時B、C的變化。
def?sort_values(by,?axis=0,?ascending=True,?kind='quicksort',?na_position='last',?ignore_index=False)
主要參數(shù)介紹:
by:字符串或字符串列表,指定按照哪個鍵/索引進行排序; axis:指定排序的軸; ascending:升序或降序,默認為升序; kind:指定排序方法,‘quicksort’, ‘mergesort’, ‘heapsort; ignore_index:是否重建索引;
例:
In[11]:?df1.sort_values(by='A')
??
?A?B?C
0?3?2?4
2?3?4?3
3?3?7?0
4?5?1?6
1?6?4?2
5?6?1?4
6. 采樣---sample()
對對象進行采樣。
主要用途:?當DataFrame對象數(shù)據(jù)量太大,導致做實驗過滿時,可以抽取一部分進行實驗,提高效率。
def?sample(n=None,?frac=None,?replace=False,?weights=None,?random_state=None,?axis=None)
主要參數(shù)介紹:
n:指定采樣的數(shù)量; frac:指定采樣的比例,與n只能選擇其中一個; replace:允許或不允許對同一行進行多次采樣; weights:采樣的權重,默認為“None”將導致相同的概率權重; random_state:類似于seed作用; axis:指定采樣的軸,默認為行;
例:
In[12]:?df1.sample(n=3)
??
?A?B?C
0?3?2?4
3?3?7?0
1?6?4?2
In[13]:?df1.sample(frac=0.1)
??
??A?B?C
1?6?4?2
7. 對象分組---groupby()
groupby方法是對對數(shù)據(jù)內(nèi)部進行分組處理。
主要用途:?在數(shù)據(jù)挖掘中主要用在了Word2vec中,例如對每個用戶的行為進行分組,形成多個句子。
直觀理解:

def?groupby(by=None,?axis=0,?level=None,?as_index=True,?sort=True,?group_keys=True,?squeeze=False,?observed=False)
主要參數(shù)介紹:
by:用于確定groupby的組; axis:指定軸;
例(以下是最近構(gòu)造的Word2vec中的句子):
groups?=?df_log.groupby(['user_id'])
df_log['creative_id']?=?df_log['creative_id'].astype('str')
print('starting....')
sentences?=?[groups.get_group(g)['creative_id'].tolist()?for?g?in?groups.groups]
8. 判斷與刪除缺失值NaN---isna()、isnull()和dropna()
isna方法返回一個布爾對象,每個元素是否為NaN。
例:
df1
?A?B?C
0?1.0?2?3
1?NaN?5?6
In[14]:?df1.isna()
??A???B???C
0?False?False?False
1?True?False?False
當數(shù)據(jù)量很大時,上述很難觀察到某列是否存在缺失,此時可以用isnull()方法
In[15]:?df1.isnull().all()??#?某列是否全部為NaN
A????False
B????False
C????False
dtype:?bool
??
In[16]:?df1.isnull().any()?#?某列是否出現(xiàn)NaN
??
A?????True
B????False
C????False
dtype:?bool
dropna方法刪除含缺失值的行或列。
def?dropna(axis=0,?how='any',?thresh=None,?subset=None,?inplace=False)
主要參數(shù)介紹:
axis:指定軸; how:參數(shù)為any時,行或列(axis決定)出現(xiàn)NaN時,就進行刪除;為all時,行或列全為NaN時才進行刪除; thresh:閾值,要求不為NAN的個數(shù); subset:指定鍵(列)進行判斷NAN刪除; inplace:是否更改原對象;
例:
In[17]:?df1.dropna(how='any')
??
???A?B?C
0??1?2?3
In[18]:?df1.dropna(how='any',?subset=['B'])
??
?A??B?C
0?1??2?3
1?NaN?5?6
9. 篩選或刪除特定值的行---isin()
判斷對象中是否存在某個值(列表、Series或DataFrame)。
主要用途:?當缺失值不為NaN時,例如缺失值是一個字符串“\N“(比賽中碰到了),要想更改或刪除,則用isin方法較為方便,通過加負號想刪除符合條件的行,不寫負號是篩選出符合條件的行。
def?isin(values)
values:需要判斷的值列表(不能為單個數(shù)值或字符串),可以為一個Series,或DataFrame(當對象為DataFrame);
例(刪除包含某字符串的行):
df1
?A?B?C
0?1?2?3
1?4?\N?6
2?7?8?9
In[19]:?df1[-df1.B.isin(['\\N'])]
??
??
?A?B?C
0?1?2?3
2?7?8?9
篩選過程中,isin()方法只能判斷包含,布爾方法則可以進行更豐富的篩選:
df1?
?A?B?C
0?3?4?2
1?0?5?4
2?0?7?5
3?3?2?5
4?2?0?0
5?5?3?7
In[20]:?df1[df1.A?>?2]
??
A?B?C
0?3?4?2
3?3?2?5
5?5?3?7?
10. 值替換---where()
通過布爾序列選擇一個返回的子集。
主要用途:?對對象進行篩選,并且對于不滿足的值,where方法可以對其進行替換。例如若列為性別,元素為字符串,可將其進行替換為數(shù)值。
例:
df1
?A?B?C
0?5?7?4
1?2?0?5
2?4?2?4
3?2?6?2
4?5?1?6
5?3?3?4
In[21]:?df1.where(df1?>?3,?-1)
?A???B???C
0?5???7??4
1?-1??-1?5
2?4???-1?4
3?-1??6???-1
4?5???-1?6
5?-1??-1?4
關于值替換,還可以用如下布爾判斷方法:
In[22]:?df1[df1.A?<=?3]?=?-1
?A???B???C
0?5???7??4
1?-1??0??5
2?4???2??4
3?-1??6???2
4?5???1??6
5?-1??3??4
注意:?where()方法是對不滿足的進行替換,上述方法是對滿足條件的進行替換
總結(jié)
果然真正的打比賽才能發(fā)現(xiàn)有那么多知識已經(jīng)遺忘,記得及時整理才能方便以后進行鞏固。
往期精彩回顧
獲取一折本站知識星球優(yōu)惠券,復制鏈接直接打開:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):
