pandas常用函數(shù)

??說起pandas這個(gè)是python數(shù)據(jù)清洗的利器键耕,它可以讓你像sql一樣操作數(shù)據(jù)咧叭,同時(shí)可以對數(shù)據(jù)進(jìn)行各種計(jì)算葱跋,轉(zhuǎn)換完成后還可以方便的存儲(chǔ)到excel澳化,轉(zhuǎn)化為array崔步、Matrix供進(jìn)一步(模型)使用。但是網(wǎng)上關(guān)于pandas的知識(shí)點(diǎn)比較散缎谷,本文就按照筆者的理解井濒,分門別類的來介紹pandas的常用函數(shù)。本文可能稍微有點(diǎn)長慎陵,但是能夠滿足你對于pandas學(xué)習(xí)的所有需要眼虱,本文介紹的函數(shù)在實(shí)際中也很常用。本文較長席纽,也可以當(dāng)做參考使用捏悬。


以下數(shù)據(jù)的操作,基于這幾個(gè)基礎(chǔ)數(shù)據(jù)润梯。

data_a 
   1  2   3   4
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
data_b
     A    B  C    D
0  1.0  1.0  2  2.0
1  2.0  3.0  2  2.0
2  2.0  3.0  1  4.0
3  2.0  3.0  2  2.0
data_c
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  2.0
2  NaN  NaN  NaN
3  8.0  8.0  NaN

??發(fā)現(xiàn)大家大于axis=0和axis=1參數(shù)到底怎么用不了解过牙,經(jīng)常混淆纺铭,到底是對列還是對行操作寇钉。其實(shí)這么理解比較好,axis=0是默認(rèn)的舶赔,按行進(jìn)行操作扫倡,其實(shí)就是對列進(jìn)行一系列操作;axis=1需要自己設(shè)置,按列進(jìn)行操作竟纳,其實(shí)就是對行進(jìn)行一系列操作撵溃。
axis=0和axis=1理解

1.數(shù)據(jù)操作函數(shù)

??數(shù)據(jù)操作函數(shù)包括數(shù)據(jù)的讀取、檢查锥累、規(guī)整等操作缘挑,是數(shù)據(jù)清洗的開始階段。

  • read系列函數(shù)
    ??這個(gè)知識(shí)點(diǎn)比較多桶略,因?yàn)閜andas可讀的數(shù)據(jù)類型非常多语淘,所以我單獨(dú)寫一篇介紹這個(gè)知識(shí)點(diǎn)诲宇,但是最常用的還是read_csv,這個(gè)函數(shù)尤其要注意編碼問題惶翻。
  • columns姑蓝、index
    ??嚴(yán)格說這兩個(gè)不叫函數(shù)而是叫屬性,但為了介紹方便维贺,姑且放到函數(shù)里它掂,分別返回列名和行名,這個(gè)沒啥好說的溯泣,注意使用的時(shí)候不要打括號(hào)。
  • head和tail函數(shù)
    ??這兩個(gè)函數(shù)分別取你的dataframe的前幾行和后幾行數(shù)據(jù)榕茧,只有一個(gè)參數(shù)n垃沦,就是你想看幾行就head或tail幾行。
  • rename函數(shù)
    ??這個(gè)函數(shù)是對列名進(jìn)行更改用押,通常在讀數(shù)據(jù)的時(shí)候可以設(shè)置header=True讀取第一行作為列名肢簿,或者人為給定columns參數(shù),但是很多時(shí)候我們需要對列名進(jìn)行更改蜻拨,此時(shí)用rename函數(shù)池充,基本用法為rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)。rename函數(shù)也可以通過指定axis參數(shù)或者index,column參數(shù)設(shè)置修改行名或者列名缎讼,這里還有一個(gè)參數(shù)比較有用就是inplace收夸,默認(rèn)為false即返回新的dataframe,如果為true則在原dataframe上進(jìn)行操作血崭。最常用的就是利用字典改名卧惜,用鍵值對的形式將原列名和現(xiàn)列名對應(yīng)起來。當(dāng)然還有一種笨辦法直接通過df.columns = list[]夹纫,這個(gè)list要求和df的colunms長度完全相同咽瓷,否則報(bào)錯(cuò)。
data_b.rename(index=str, columns={"A": "a", "B": "c"})
-- 輸出
Out[127]: 
     a    c  C    D
0  1.0  1.0  2  2.0
1  2.0  3.0  2  2.0
2  2.0  3.0  1  4.0
3  2.0  3.0  2  2.0
  • reindex函數(shù)
    ??reindex函數(shù)是為series或dataframe增加或減少索引舰讹、列名用的茅姜,注意不可以用它為index改名(改名還是要用rename,設(shè)置axis=1)月匣,增加索引钻洒,沒有默認(rèn)值定義為為Nan,減少索引相當(dāng)于對index進(jìn)行切片了桶错。reindex官方文檔給了很多參數(shù)航唆,但只有幾個(gè)很重要,column院刁、index糯钙,即控制對行、列的操作,fill_value控制默認(rèn)缺省值任岸。
data_b.reindex(columns=['A','B','C','D','E'],fill_value=3.0)
-- 輸出
     A    B  C    D    E
0  1.0  1.0  2  2.0  3.0
1  2.0  3.0  2  2.0  3.0
2  2.0  3.0  1  4.0  3.0
3  2.0  3.0  2  2.0  3.0
data_b.reindex(index=['0','1','2','3'],fill_value=3.0)
--輸出
     A    B    C    D
0  3.0  3.0  3.0  3.0
1  3.0  3.0  3.0  3.0
2  3.0  3.0  3.0  3.0
3  3.0  3.0  3.0  3.0
  • set_index函數(shù)和reset_index函數(shù)
    ??set_index可以設(shè)置單索引或者多索引再榄,基本用法為set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) 大部分情況下我們只需要關(guān)注keys這個(gè)指標(biāo),其他指標(biāo)可以不關(guān)注享潜。reset_index()就是取消索引困鸥,重新變?yōu)檎麛?shù)索引那種形式。
data_b.set_index(['A','B'])
--輸出
         C    D
A   B          
1.0 1.0  2  2.0
2.0 3.0  2  2.0
    3.0  1  4.0
    3.0  2  2.0
data_b.reset_index()
--輸出
   index    A    B  C    D
0      0  1.0  1.0  2  2.0
1      1  2.0  3.0  2  2.0
2      2  2.0  3.0  1  4.0
3      3  2.0  3.0  2  2.0
  • describe函數(shù)
    ??這個(gè)函數(shù)真是良心剑按,沒有任何參數(shù)疾就,直接對著你的數(shù)據(jù)框用就可以了,輸出的是對于你數(shù)據(jù)框整體數(shù)據(jù)的描述艺蝴。
data_a.describe()
--輸出
         1    2     3     4
count  3.0  3.0   3.0   3.0
mean   4.0  5.0   6.0   7.0
std    4.0  4.0   4.0   4.0
min    0.0  1.0   2.0   3.0
25%    2.0  3.0   4.0   5.0
50%    4.0  5.0   6.0   7.0
75%    6.0  7.0   8.0   9.0
max    8.0  9.0  10.0  11.0
  • info函數(shù)
    ??這個(gè)函數(shù)用來查看數(shù)據(jù)的類型猬腰,有沒有缺失值,在進(jìn)行特征工程的時(shí)候比較好用猜敢。
data_a.info()
--輸出
Data columns (total 4 columns):
1    3 non-null int64
2    3 non-null int64
3    3 non-null int64
4    3 non-null int64
dtypes: int64(4)
memory usage: 176.0 bytes
  • shape函數(shù)
  • values函數(shù)
  • df.duplicated函數(shù)
  • df.drop_duplicates函數(shù)
    ??這個(gè)函數(shù)用于去除重復(fù)值姑荷,基本用法為data.drop_duplicates(subset=['A','B'],keep='first',inplace=True),其中subset指明了要去除重復(fù)值的列缩擂,keep指明要保留的列鼠冕。用法比較簡單,看個(gè)例子胯盯。
data_b.drop_duplicates(subset=['A'],keep='first')
-- 輸出
     A    B  C    D
0  1.0  1.0  2  2.0
1  2.0  3.0  2  2.0
  • drop函數(shù)
    ??用于刪除數(shù)據(jù)框中的某一行或者某一列懈费,基本用法為drop(labels=None,axis=0, index=None, columns=None, inplace=False)
    ,默認(rèn)刪除的是行陨闹,如果想刪除列的話楞捂,得指定axis=1。也可以直接指定index或columns確定要?jiǎng)h除的行或列趋厉。
data_b.drop(columns=['A'])
data_b.drop('A',axis=1)
-- 輸出
     B  C    D
0  1.0  2  2.0
1  3.0  2  2.0
2  3.0  1  4.0
3  3.0  2  2.0
  • replace函數(shù)
    ??用于數(shù)據(jù)的替換寨闹,基本用法是replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad'),其中to_replace的字段可以用字典表示君账。
data_b.replace({'A':1,'B':3},10)
-- 輸出
      A     B  C    D
0  10.0   1.0  2  2.0
1   2.0  10.0  2  2.0
2   2.0  10.0  1  4.0
3   2.0  10.0  2  2.0
  • cut函數(shù)
    ??cut函數(shù)用來對數(shù)組進(jìn)行切分繁堡,就是把連續(xù)的數(shù)據(jù)劃分為幾個(gè)區(qū)間,基本使用方法是cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')乡数。x是要?jiǎng)澐值膕eries椭蹄,必須是series不能是dataframe。bins可以是整數(shù)也可以是自己定義的區(qū)間净赴。labels這個(gè)參數(shù)用于給你切分完以后生成的數(shù)據(jù)進(jìn)行類別標(biāo)記绳矩。其他參數(shù)可以忽略。這個(gè)的用法只能是pd.cut()玖翅,不能用其他寫法翼馆,如果是指定的分組區(qū)間割以,那么是左不包含,這點(diǎn)需要注意应媚。
0    0
1    1
2    1
3    1
Name: A, dtype: category
Categories (2, int64): [0 < 1]
  • get_dummies函數(shù)
    ??這個(gè)函數(shù)用來實(shí)現(xiàn)onehot編碼顯然適用于數(shù)據(jù)挖掘严沥,使用以后會(huì)進(jìn)行index-column的轉(zhuǎn)換,基本用法是get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)中姜。案例說明一下消玄。
pd.get_dummies(data_b.C)
-- 輸出
   1  2
0  0  1
1  0  1
2  1  0
3  0  1

??接下來的函數(shù)是對缺失值進(jìn)行處理。

  • isnull函數(shù)和notnull函數(shù)
    ??這兩個(gè)函數(shù)是對元素級別的操作丢胚,即對每一個(gè)位置判斷是否是空值翩瓜,isnull的功能是如果是空值就返回Ture,否則返回False嗜桌,notnull和isnull的作用相反奥溺。由于是元素級的操作,因此返回的是和原dataframe行列一樣的包含邏輯True和False的dataframe骨宠,用于布爾型的邏輯判斷。因?yàn)樵瓉淼膁ata_b沒有空數(shù)據(jù)相满,做個(gè)shift處理先层亿,shift函數(shù)會(huì)在后邊說,這里先用立美。
data_b.shift()
-- 輸出
     A    B    C    D
0  NaN  NaN  NaN  NaN
1  1.0  1.0  2.0  2.0
2  2.0  3.0  2.0  2.0
3  2.0  3.0  1.0  4.0
data_b.shift().isnull()
-- 輸出
       A      B      C      D
0   True   True   True   True
1  False  False  False  False
2  False  False  False  False
3  False  False  False  False
data_b.shift().notnull()
-- 輸出
       A      B      C      D
0  False  False  False  False
1   True   True   True   True
2   True   True   True   True
3   True   True   True   True
  • dropna函數(shù)
    ??dropna這個(gè)函數(shù)就是移除缺失值匿又,但是針對series和dataframe它的操作邏輯是不一樣的。對于series只是把NA值刪除建蹄,而對于dataframe是把包括NA值的行或列都刪除碌更,默認(rèn)axis=0。更多用法參考請參考官方文檔洞慎。dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)痛单,介紹一個(gè)thresh參數(shù)如果設(shè)置了這個(gè)值,那么只有含大于這個(gè)值的非空行/列才會(huì)保留劲腿,還有subset參數(shù)指定刪除哪一行或者哪一列包含空值的數(shù)據(jù)旭绒。
data_b.shift().A.dropna()
-- 輸出
1    1.0
2    2.0
3    2.0
Name: A, dtype: float64
data_b.shift().dropna()
-- 輸出
     A    B    C    D
1  1.0  1.0  2.0  2.0
2  2.0  3.0  2.0  2.0
3  2.0  3.0  1.0  4.0
data_b.shift().dropna(axis=1)
-- 輸出
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
  • fillna函數(shù)
    ??對缺失值進(jìn)行填充處理,fillna(value=None, method=None, axis=0) 焦人,method包括'backfill', 'bfill', 'pad', 'ffill', None這幾個(gè)用法各不相同挥吵。首先fillna只有一個(gè)value,就是全部空值填充花椭。當(dāng)然value也可以用字典填充忽匈,指定特定的列填充不同的值{'A':10,'B':20}。說完這個(gè)接著說method矿辽,pad和ffill類似丹允,都是前項(xiàng)填充郭厌,backfill和bfill都是后項(xiàng)填充,可以用limit限制最多向前尋找?guī)讉€(gè)值嫌松,用axis設(shè)置填充方向沪曙。
data_c.fillna(10)
--輸出
      0     1     2
0   1.0   2.0   3.0
1  10.0  10.0   2.0
2  10.0  10.0  10.0
3   8.0   8.0  10.0
data_c.fillna(method = 'bfill')
-- 輸出
     0    1    2
0  1.0  2.0  3.0
1  8.0  8.0  2.0
2  8.0  8.0  NaN
3  8.0  8.0  NaN
data_c.fillna(method = 'ffill',limit=2)
-- 輸出
     0    1    2
0  1.0  2.0  3.0
1  1.0  2.0  2.0
2  1.0  2.0  2.0
3  8.0  8.0  2.0

2.數(shù)據(jù)處理函數(shù)

??數(shù)據(jù)處理函數(shù)是對數(shù)據(jù)進(jìn)行切片、格式轉(zhuǎn)換萎羔、排序以及對數(shù)據(jù)框進(jìn)行連接等操作液走。

  • reshape函數(shù)
    ??很遺憾這個(gè)函數(shù)python已經(jīng)不支持了,各位看官要用reshape去numpy里的ndarray用吧贾陷。
  • stack和unstack函數(shù)
    ??stack和unstack函數(shù)是對行列索引進(jìn)行轉(zhuǎn)換用的缘眶,stack將columns變?yōu)閕ndex,unstack相反髓废,將index變?yōu)閏olumns巷懈,這個(gè)對于多層索引應(yīng)用效果比較好,其實(shí)是為了聚合統(tǒng)計(jì)方便的慌洪。這兩個(gè)函數(shù)知識(shí)點(diǎn)比較多顶燕,要弄清楚還是去查官方文檔。
data_b.stack()
-- 輸出
0  A    1.0
   B    1.0
   C    2.0
   D    2.0
1  A    2.0
   B    3.0
   C    2.0
   D    2.0
2  A    2.0
   B    3.0
   C    1.0
   D    4.0
3  A    2.0
   B    3.0
   C    2.0
   D    2.0
dtype: float64
data_b.stack().unstack()
-- 輸出
     A    B    C    D
0  1.0  1.0  2.0  2.0
1  2.0  3.0  2.0  2.0
2  2.0  3.0  1.0  4.0
3  2.0  3.0  2.0  2.0
  • pivot和pivot_table
    ??這兩個(gè)函數(shù)真的可以讓你像操作excel的數(shù)據(jù)透視表一樣操作dataframe冈爹,pivot函數(shù)功能簡單涌攻,就是做一個(gè)展示,不能進(jìn)行聚合操作频伤,而pivottable可以做聚合操作恳谎。通過例子來感受一下。
data = {'date': ['2018-08-01', '2018-08-02', '2018-08-03', '2018-08-01', '2018-08-03', '2018-08-03',
                 '2018-08-01', '2018-08-02'],
        'variable': ['A','A','A','B','B','C','C','C'],
        'value': [3.0 ,4.0 ,6.0 ,2.0 ,8.0 ,4.0 ,10.0 ,1.0 ]}
df = pd.DataFrame(data=data, columns=['date', 'variable', 'value'])
df1 = df.pivot(index='date', columns='variable', values='value')
print(df1)
-- 輸出
variable      A    B     C
date                      
2018-08-01  3.0  2.0  10.0
2018-08-02  4.0  NaN   1.0
2018-08-03  6.0  8.0   4.0
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                    "bar", "bar", "bar", "bar"],
              "B": ["one", "one", "one", "two", "two",
                      "one", "one", "two", "two"],
              "C": ["small", "large", "large", "small",
                      "small", "large", "small", "small",
                      "large"],
              "D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})
print(pd.pivot_table(df, index=['A', 'B'], columns=['C'], values=['D'], aggfunc=[np.mean, np.sum, max]))
-- 輸出
        mean         sum         max      
            D           D           D      
C       large small large small large small
A   B                                      
bar one   4.0   5.0   4.0   5.0   4.0   5.0
    two   7.0   6.0   7.0   6.0   7.0   6.0
foo one   2.0   1.0   4.0   1.0   2.0   1.0
    two   NaN   3.0   NaN   6.0   NaN   3.0
  • loc和iloc函數(shù)
    ??操作任何一個(gè)數(shù)據(jù)類型憋肖,切片都是必須要掌握的因痛,通過切片可以取值和進(jìn)行賦值操作。dataframe切片最簡單的是通過columns和index直接取值岸更,有兩種模式比如df['列A']和df.列A鸵膏。但是要取到具體某一列某個(gè)index的數(shù)據(jù),就需要采用loc和iloc函數(shù)了坐慰。loc這個(gè)函數(shù)有兩個(gè)參數(shù)较性,index名和columns名,只能用名字结胀,不能用索引赞咙,columns省略時(shí)默認(rèn)返回所有列,注意取列的時(shí)候用方括號(hào)括起來糟港。loc函數(shù)還有一個(gè)作用就是根據(jù)邏輯值進(jìn)行切片攀操。
data_b.loc[0,['A']]
-- 輸出
A    1.0
Name: 0, dtype: float64
data_b.loc[data_b['A']==1]
-- 輸出
     A    B  C    D
0  1.0  1.0  2  2.0

??相比于loc,iloc就比較友好了秸抚,可以用index名和columns名也可以用位置索引速和,混用這種寫法真是太好了歹垫。

data_b.iloc[1,0:3]
-- 輸出
A    2.0
B    3.0
C    2.0
Name: 1, dtype: float64
  • ix函數(shù)
  • sort_index函數(shù)和sort_values函數(shù)
    ??這是排序函數(shù),sort_index函數(shù)目前不建議使用了颠放,統(tǒng)一用sort_values函數(shù)排惨。其實(shí)參數(shù)都是差不多的,sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')碰凶,這個(gè)by就是按照哪一列排序暮芭,其他參數(shù)根據(jù)字面意思可以理解。
data_b.sort_values(by='A',ascending=False)
--輸出
     A    B  C    D
1  2.0  3.0  2  2.0
2  2.0  3.0  1  4.0
3  2.0  3.0  2  2.0
0  1.0  1.0  2  2.0
  • 數(shù)據(jù)格式轉(zhuǎn)換函數(shù)
    ??因?yàn)橐恍┰蛭覀兛傄M(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換欲低,最常用的就是astype函數(shù)辕宏,這個(gè)是元素級別的操作,要對某一列數(shù)據(jù)進(jìn)行操作砾莱,df.A.astype('int')瑞筐。還有比較常用的是to_numbric函數(shù)和to_datetime函數(shù)。先手to_datetime函數(shù)腊瑟,這個(gè)函數(shù)常用的參數(shù)也就那么兩個(gè)聚假,to_datetime('13000101', format='%Y%m%d', errors='ignore'),第一個(gè)是要轉(zhuǎn)換的字符串闰非,第二個(gè)是要轉(zhuǎn)換的日期格式魔策,其他參數(shù)可以忽略。to_numbric函數(shù)就更簡單了河胎,只要傳給指定的參數(shù),如果符合純數(shù)字特征就轉(zhuǎn)換為數(shù)字虎敦。還有一種方法就是對某一列數(shù)據(jù)使用apply(int)游岳、apply(str)等方法。
    ??重點(diǎn)說一下日期格式的轉(zhuǎn)換其徙,這個(gè)只能對pandas對象使用胚迫,比如pd.to_datetime([],format=)是對的,如果是pd[列A].to_datetime()用法確實(shí)錯(cuò)的唾那。
    ??關(guān)于format =''访锻,我給大家提供如下的格式標(biāo)準(zhǔn)。
    %d 日期, 01-31
    %f 小數(shù)形式的秒闹获,SS.SSS
    %H 小時(shí), 00-23
    %j 算出某一天是該年的第幾天期犬,001-366
    %m 月份,00-12
    %M 分鐘, 00-59
    %s 從1970年1月1日到現(xiàn)在的秒數(shù)
    %S 秒, 00-59
    %w 星期, 0-6 (0是星期天)
    %W 算出某一天屬于該年的第幾周, 01-53
    %Y 年, YYYY
    %% 百分號(hào)
start = pd.to_datetime("5-1-2012")#只有pd.to_datetime這一種寫法
-- 輸出
2012-05-01 00:00:00

  • merge函數(shù)
    ??這個(gè)函數(shù)是將兩個(gè)dataframe進(jìn)行合并避诽,需要指明用于合并的列龟虎,即on參數(shù),可以理解為sql的join操作沙庐±鹜祝基本用法為merge(df1,df2, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’))佳吞,要解釋的參數(shù)是how,選擇連接的方式棉安,有outer底扳、inner、left贡耽、right四個(gè)參數(shù)可供選擇衷模,跟sql一樣,不多說了菇爪。left_on和right_on指定左右連接的主鍵算芯,如果兩個(gè)主鍵名字一樣,用on就行了凳宙。left_index和right_index指定用左右的索引作為連接鍵熙揍。suffixes列名重復(fù)了怎么辦,用下劃線區(qū)分氏涩。最后注意一點(diǎn)届囚,一次只能merge兩個(gè)dataframe。
data_a.merge(data_b,left_index=True,right_index=True,how='outer')
-- 輸出
     1    2     3     4    A    B  C    D
0  0.0  1.0   2.0   3.0  1.0  1.0  2  2.0
1  4.0  5.0   6.0   7.0  2.0  3.0  2  2.0
2  8.0  9.0  10.0  11.0  2.0  3.0  1  4.0
3  NaN  NaN   NaN   NaN  2.0  3.0  2  2.0

  • concat函數(shù)
    ??數(shù)據(jù)拼接函數(shù)是尖,可以拼接series意系,dataframe等,與merge不同饺汹,concat可以連接很多個(gè)dataframe蛔添,基本用法為pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
    keys=None, levels=None, names=None, verify_integrity=False),默認(rèn)是按行的方向堆疊兜辞。其他參數(shù)都不是特別重要迎瞧,一般也不用設(shè)置,當(dāng)然有時(shí)候根據(jù)使用場景還是要調(diào)整一下逸吵。這個(gè)要注意objs參數(shù)是dataframe或者series構(gòu)成的列表凶硅。不能寫一個(gè)dataframe,否則會(huì)報(bào)錯(cuò)扫皱。
pd.concat([data_b,data_b])
-- 輸出
     A    B  C    D
0  1.0  1.0  2  2.0
1  2.0  3.0  2  2.0
2  2.0  3.0  1  4.0
3  2.0  3.0  2  2.0
0  1.0  1.0  2  2.0
1  2.0  3.0  2  2.0
2  2.0  3.0  1  4.0
3  2.0  3.0  2  2.0
pd.concat([data_a,data_b],axis=1)
-- 輸出
     1    2     3     4    A    B  C    D
0  0.0  1.0   2.0   3.0  1.0  1.0  2  2.0
1  4.0  5.0   6.0   7.0  2.0  3.0  2  2.0
2  8.0  9.0  10.0  11.0  2.0  3.0  1  4.0
3  NaN  NaN   NaN   NaN  2.0  3.0  2  2.0
  • join函數(shù)

3.數(shù)據(jù)聚合函數(shù)

??數(shù)據(jù)聚合操作是對數(shù)據(jù)進(jìn)行統(tǒng)計(jì)意義上的操作或者自定義函數(shù)進(jìn)行計(jì)算足绅。

  • groupby函數(shù)
    ??為什么把groupby函數(shù)放到第一個(gè)講呢,因?yàn)橛泻芏鄷r(shí)候你做統(tǒng)計(jì)除了針對行列韩脑,更多時(shí)候是要基于分組的氢妈,大部分聚合函數(shù)要在分組的基礎(chǔ)上做。
    ??groupby有兩種典型用法:
    ??(1)grouped=df['列a'].groupby([df['列b'],df['列c'])
    ??(2)grouped=df.groupby(['列b','列c'])['列a']
    ??這兩種寫法是一樣的意思扰才,用哪個(gè)都可以允懂,但是應(yīng)用的時(shí)候要注意特殊的寫法。
  • map和applymap函數(shù)
    ??map函數(shù)是元素級別的操作衩匣,這個(gè)要注意什么呢蕾总,你不能對著一個(gè)dataframe進(jìn)行map操作粥航,要用map首先得是一個(gè)series,然后是對里邊的元素進(jìn)行操作生百。如果你想對數(shù)據(jù)框進(jìn)行操作怎么辦递雀,有一個(gè)applymap函數(shù),是對數(shù)據(jù)框里的所有元素進(jìn)行操作蚀浆。
lambda x: x*x
data_b.map(lambda x: x*x)
data_b.applymap(lambda x: x*x)
--第一個(gè)輸出報(bào)錯(cuò)
  File "/Users/elliot/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 4376, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'map'
-- 第二個(gè)輸出
     A    B  C     D
0  1.0  1.0  4   4.0
1  4.0  9.0  4   4.0
2  4.0  9.0  1  16.0
3  4.0  9.0  4   4.0
  • apply函數(shù)
    ??apply是pandas里對行缀程、列級元素進(jìn)行操作的函數(shù),也就是計(jì)算時(shí)按行或者列為最小單位進(jìn)行市俊。這個(gè)函數(shù)使用靈活杨凑,因此最常被使用“诿粒基本用法為:apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=args=(), **kwds)撩满,洋洋灑灑寫了這么多參數(shù),其實(shí)能用到的也就是func和axis了绅你,func就是你要應(yīng)用的函數(shù)伺帘,axis決定對行或者對列進(jìn)行操作。
data_b.apply(sum)
-- 輸出
A     7.0
B    10.0
C     7.0
D    10.0
dtype: float64
  • agg函數(shù)
    ??agg函數(shù)和apply函數(shù)其實(shí)是一樣的忌锯,只不過它可以指定不同的列用不同的函數(shù)伪嫁,或者指定所有列用不同的函數(shù),可供選擇的范圍更廣偶垮。
    ??agg函數(shù)也有兩種寫法:
    ??(1)df.groupby(['列b']).agg([sum,mean,max])
    ??(2)df.groupby(['列b']).agg({'列a':sum,'列b':np.mean})
data_b.groupby(['B','C']).agg([sum,np.mean,max])
--輸出
         A              D          
       sum mean  max  sum mean  max
B   C                              
1.0 2  1.0  1.0  1.0  2.0  2.0  2.0
3.0 1  2.0  2.0  2.0  4.0  4.0  4.0
    2  4.0  2.0  2.0  4.0  2.0  2.0
data_b.groupby(['B']).agg({'A':sum,'B':np.mean})
-- 輸出
       A    B
B            
1.0  1.0  1.0
3.0  6.0  3.0

??以下的所有函數(shù)张咳,除極個(gè)別外都可以配合上面的分組和應(yīng)用函數(shù)使用。


  • sum函數(shù)
    ??求和函數(shù)似舵,沒有什么好說的晶伦。基本用法為sum(a啄枕,axis=0),默認(rèn)是沿著行方向進(jìn)行的加和族沃,也就是對列求和频祝,axis=1表示沿著列方向求和,也就是對行求和脆淹。
  • mean函數(shù)
    ??求均值的函數(shù)常空,注意求均值就是mean,可沒有什么avg函數(shù)盖溺,還有你正常對數(shù)據(jù)框或者series用mean這些都沒問題漓糙,但是要用在apply等函數(shù)里,最好還是加一個(gè)np烘嘱,用np.mean昆禽,目前其他函數(shù)沒發(fā)現(xiàn)這個(gè)問題蝗蛙,大家用的時(shí)候注意吧。
  • count函數(shù)和value_counts函數(shù)
    ??計(jì)數(shù)函數(shù)醉鳖,對dataframe里的數(shù)據(jù)進(jìn)行非NA值的統(tǒng)計(jì)捡硅。這個(gè)是對所有元素進(jìn)行的無差別操作,就是有一個(gè)非NA值就加1盗棵。但是有的時(shí)候我們需要對于某一列中有哪些不同元素進(jìn)行計(jì)數(shù)統(tǒng)計(jì)壮韭,這個(gè)時(shí)候就要用value_counts函數(shù),由于這是元素級別的操作纹因,所以這個(gè)只能對dataframe的某一列就是series使用喷屋。
data_b.count()
data_b['A'].value_counts()
--輸出
A    4
B    4
C    4
D    4
2.0    3
1.0    1
  • unique函數(shù)
    ??unique函數(shù)返回的是某一列的不重復(fù)值,是對列進(jìn)行的操作瞭恰,常用的方法是df.列A.unique()屯曹,這個(gè)不啰嗦了阁谆,只注意一點(diǎn)占卧,unique返回值是數(shù)組。
  • min和max函數(shù)
    ??這個(gè)真的沒啥好說的礁击,求最大最小值陕截。
  • median函數(shù)
    ??返回中位數(shù)驳棱。
  • std和var函數(shù)
    ??返回標(biāo)準(zhǔn)差和方法,計(jì)算方法是除以樣本數(shù)-1(n-1)农曲。
  • mode函數(shù)
    ??這個(gè)函數(shù)的作用是沿著某個(gè)軸返回一組眾數(shù)社搅,為什么說是一組呢,因?yàn)橛锌赡鼙姅?shù)不止一個(gè)乳规⌒卧幔基本用法為:mode(axis=0, numeric_only=False),也就是說不僅可以對數(shù)字操作還可以對字符類型進(jìn)行操作暮的,默認(rèn)是沿著行方向返回眾數(shù)笙以。這個(gè)需要案例說明,可以看出返回的是一個(gè)dataframe冻辩,因?yàn)楸姅?shù)不止一個(gè)會(huì)按順序輸出猖腕,行數(shù)跟眾數(shù)最多的那一列的眾數(shù)個(gè)數(shù)相同,缺失值以NaN填充恨闪。但是眾數(shù)我們只需要一個(gè)倘感,這個(gè)時(shí)候用iloc切片操作,即data_b.mode().iloc[0,:]咙咽。
data_b = pd.DataFrame({'A':[1,2,3,4],'B':[1,3,3,4],'C':[2,2,1,2]})
data_b.mode()
data_b.mode(axis = 1)
--輸出1
   A    B    C
0  1  3.0  2.0
1  2  NaN  NaN
2  3  NaN  NaN
3  4  NaN  NaN
--輸出2
   0
0  1
1  2
2  3
3  4
  • corr函數(shù)
    ??這個(gè)函數(shù)返回的是各列的相關(guān)系數(shù)老玛,[-1,1]之間,1代表嚴(yán)格正相關(guān),-1代表嚴(yán)格負(fù)相關(guān)蜡豹◆锪福基本用法為:corr(method='pearson', min_periods=1),其中method可選{‘pearson’, ‘kendall’, ‘spearman’}余素,默認(rèn)用pearson豹休,min_periods樣本最少的數(shù)據(jù)量,默認(rèn)是1桨吊。舉個(gè)栗子感受一下威根。
data_b.corr()
--輸出
          A         B         C         D
A  1.000000  1.000000 -0.333333  0.333333
B  1.000000  1.000000 -0.333333  0.333333
C -0.333333 -0.333333  1.000000 -1.000000
D  0.333333  0.333333 -1.000000  1.000000
  • argmax函數(shù)和argmin函數(shù)(idxmax和idxmin)
    ??這兩個(gè)函數(shù)也是元素級別操作的函數(shù),因此也可以再series中使用而不可以再dataframe中使用视乐。未來argmax函數(shù)和argmin函數(shù)就不支持了洛搀,以后直接用idxmax和idxmin函數(shù)。
data_b['A'].idxmax()
--輸出
1
  • cumsum函數(shù)和cumprod函數(shù)
    ??這個(gè)是對行列操作的函數(shù)佑淀,返回的是與原dataframe大小完全一樣的dataframe留美,不過是對結(jié)果進(jìn)行累加和累乘操作了。
data_b.cumsum()
data_b.cumprod()
-- 輸出
     A     B    C     D
0  1.0   1.0  2.0   2.0
1  3.0   4.0  4.0   4.0
2  5.0   7.0  5.0   8.0
3  7.0  10.0  7.0  10.0
     A     B    C     D
0  1.0   1.0  2.0   2.0
1  2.0   3.0  4.0   4.0
2  4.0   9.0  4.0  16.0
3  8.0  27.0  8.0  32.0
  • cummin函數(shù)和cummax函數(shù)
    ??累計(jì)最大和最小值伸刃,工作中其實(shí)沒遇到谎砾,但是這個(gè)顯然是有用的,同樣作用于dataframe捧颅,返回的是每一行/列景图,截止到當(dāng)前元素的最大值和最小值。
data_b.cummin()
data_b.cummax()
--輸出
     A    B    C    D
0  1.0  1.0  2.0  2.0
1  1.0  1.0  2.0  2.0
2  1.0  1.0  1.0  2.0
3  1.0  1.0  1.0  2.0
     A    B    C    D
0  1.0  1.0  2.0  2.0
1  2.0  3.0  2.0  2.0
2  2.0  3.0  2.0  4.0
3  2.0  3.0  2.0  4.0
  • pct_change函數(shù)
    ??這個(gè)函數(shù)碉哑,特別適合時(shí)間序列相關(guān)的操作挚币,算的是前后數(shù)據(jù)的差距百分比,就是后數(shù)減前數(shù)除以前數(shù)扣典。返回的也是和原dataframe行列數(shù)一樣的dataframe妆毕。
data_b.pct_change()
-- 輸出
     A    B    C    D
0  NaN  NaN  NaN  NaN
1  1.0  2.0  0.0  0.0
2  0.0  0.0 -0.5  1.0
3  0.0  0.0  1.0 -0.5
  • diff函數(shù)
    ??這個(gè)函數(shù)和上面那個(gè)pct_change函數(shù)一樣也是用于時(shí)間序列的操作,就是向前或者向后截取數(shù)據(jù)贮尖,截取不到的取空笛粘,返回的是和原dataframe行列數(shù)一樣的dataframe∈酰基本用法為diff(periods=1, axis=0)闰蛔,axis我就不解釋了,這個(gè)periods就是移動(dòng)的步數(shù)图柏,可取正或者負(fù),正就是往下走一步任连,負(fù)就是往上走一步蚤吹。
data_b.diff(-1)
data_b.diff(1)
--輸出1
     A    B    C    D
0 -1.0 -2.0  0.0  0.0
1  0.0  0.0  1.0 -2.0
2  0.0  0.0 -1.0  2.0
3  NaN  NaN  NaN  NaN
--輸出2
0  NaN  NaN  NaN  NaN
1  1.0  2.0  0.0  0.0
2  0.0  0.0 -1.0  2.0
3  0.0  0.0  1.0 -2.0
  • shift函數(shù)
    ??如果不理解上面兩個(gè)函數(shù)的操作,那么來講一下shift操作,其實(shí)就是數(shù)據(jù)的移動(dòng)裁着,是上面兩個(gè)函數(shù)計(jì)算的中間步驟繁涂。基本用法為shift(periods=1, freq=None, axis=0)二驰,這個(gè)和diff函數(shù)一樣一樣的扔罪,這個(gè)freq我稍微解釋一下就是按什么技術(shù),默認(rèn)就是int桶雀,還有datetime的例子矿酵,因?yàn)檫@個(gè)一般用于時(shí)間序列的處理。
data_b.shift()
-- 輸出
   A    B    C    D
0  NaN  NaN  NaN  NaN
1  1.0  1.0  2.0  2.0
2  2.0  3.0  2.0  2.0
3  2.0  3.0  1.0  4.0

4.數(shù)據(jù)高階操作

??這部分是筆者在進(jìn)行一次聚類分析判斷nickname是否是全為英文或者漢字字符時(shí)發(fā)現(xiàn)的矗积,非常好用全肮。

  • .dt

  • .str
    isalpha ( ) 判斷是否全是字母
    isdigit ( ) 判斷是否全是數(shù)字
    isalnum ( ) 是否全是數(shù)字或字母
    isupper ( ) ... 大寫字母
    islower ( ) ... 小寫字母
    istitle ( ) ... 首字母大寫
    isspace() ... 空白字符

5.數(shù)據(jù)保存和轉(zhuǎn)換函數(shù)

  • to_csv函數(shù)
    ??這個(gè)函數(shù)是dataframe的函數(shù),作用是將你計(jì)算得到的dataframe轉(zhuǎn)回到excel中以方便下一步的操作棘捣。官方給的參數(shù)特別多辜腺,to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression='infer', quoting=None, quotechar='"', line_terminator=None, chunksize=None, tupleize_cols=None, date_format=None, doublequote=True, escapechar=None, decimal='.')。其實(shí)重要的就是指定路徑和文件名乍恐,指定是否要第一行评疗,是否要索引和列名,指定分隔符茵烈,其他都不是特別重要百匆。這個(gè)函數(shù)我就不寫例子了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞧毙,一起剝皮案震驚了整個(gè)濱河市胧华,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宙彪,老刑警劉巖矩动,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異释漆,居然都是意外死亡悲没,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門男图,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示姿,“玉大人,你說我怎么就攤上這事逊笆≌淮粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵难裆,是天一觀的道長子檀。 經(jīng)常有香客問我镊掖,道長,這世上最難降的妖魔是什么褂痰? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任亩进,我火速辦了婚禮,結(jié)果婚禮上缩歪,老公的妹妹穿的比我還像新娘归薛。我一直安慰自己,他們只是感情好匪蝙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布主籍。 她就那樣靜靜地躺著,像睡著了一般骗污。 火紅的嫁衣襯著肌膚如雪崇猫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天需忿,我揣著相機(jī)與錄音诅炉,去河邊找鬼。 笑死屋厘,一個(gè)胖子當(dāng)著我的面吹牛涕烧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汗洒,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼议纯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溢谤?” 一聲冷哼從身側(cè)響起瞻凤,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎世杀,沒想到半個(gè)月后阀参,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞻坝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年蛛壳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所刀。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衙荐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浮创,到底是詐尸還是另有隱情忧吟,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布斩披,位于F島的核電站溜族,受9級特大地震影響胸嘴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斩祭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乡话。 院中可真熱鬧摧玫,春花似錦、人聲如沸绑青。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸婴。三九已至坏挠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邪乍,已是汗流浹背降狠。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庇楞,地道東北人榜配。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像吕晌,于是被迫代替她去往敵國和親蛋褥。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容