pandas基礎(chǔ)教程——Day4

本章內(nèi)容

pandas中的分組聚合

一菩帝、分組

import pandas as pd
import numpy as np
df=pd.DataFrame({
    'name':['BOSS','Lilei','Lilei','Han','BOSS','BOSS','Han','BOSS'],
    'Year':[2016,2016,2016,2016,2017,2017,2017,2017],
    'Salary':[999999,20000,25000,3000,9999999,999999,3500,999999],
    'Bonus':[100000,20000,20000,5000,200000,300000,3000,400000]
    })

print(df)

# 根據(jù)name這一列進(jìn)行分組
group_by_name=df.groupby('name')
print(type(group_by_name))

# 查看分組
print(group_by_name.groups)
# 分組后的數(shù)量
print(group_by_name.count())

# 查看分組的情況
for name,group in group_by_name:
    print(name) # 組的名字
    print(group)# 組的數(shù)據(jù)

# 按照某一列分組,將name這一列作為分組的鍵尝哆,對(duì)year進(jìn)行分組
group_by_name = df['Year'].groupby(df['name'])
print(group_by_name.count())

# 按照多列進(jìn)行分組
group_by_name_year=df.groupby(['name','Year'])
for name,group in group_by_name_year:
    print(name)
    print(group)

# 可以選擇分組
print(group_by_name_year.get_group(('BOSS',2016)))

'''
    name  Year   Salary   Bonus
0   BOSS  2016   999999  100000
1  Lilei  2016    20000   20000
2  Lilei  2016    25000   20000
3    Han  2016     3000    5000
4   BOSS  2017  9999999  200000
5   BOSS  2017   999999  300000
6    Han  2017     3500    3000
7   BOSS  2017   999999  400000

<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

{'BOSS': Int64Index([0, 4, 5, 7], dtype='int64'), 'Han': Int64Index([3, 6], dtype='int64'), 'Lilei': Int64Index([1, 2], dtype='int64')}

       Year  Salary  Bonus
name                      
BOSS      4       4      4
Han       2       2      2
Lilei     2       2      2

BOSS
   name  Year   Salary   Bonus
0  BOSS  2016   999999  100000
4  BOSS  2017  9999999  200000
5  BOSS  2017   999999  300000
7  BOSS  2017   999999  400000
Han
  name  Year  Salary  Bonus
3  Han  2016    3000   5000
6  Han  2017    3500   3000
Lilei
    name  Year  Salary  Bonus
1  Lilei  2016   20000  20000
2  Lilei  2016   25000  20000

name
BOSS     4
Han      2
Lilei    2
Name: Year, dtype: int64

('BOSS', 2016)
   name  Year  Salary   Bonus
0  BOSS  2016  999999  100000
('BOSS', 2017)
   name  Year   Salary   Bonus
4  BOSS  2017  9999999  200000
5  BOSS  2017   999999  300000
7  BOSS  2017   999999  400000
('Han', 2016)
  name  Year  Salary  Bonus
3  Han  2016    3000   5000
('Han', 2017)
  name  Year  Salary  Bonus
6  Han  2017    3500   3000
('Lilei', 2016)
    name  Year  Salary  Bonus
1  Lilei  2016   20000  20000
2  Lilei  2016   25000  20000

   name  Year  Salary   Bonus
0  BOSS  2016  999999  100000
'''

二、聚合

聚合的函數(shù)
mean        計(jì)算分組平均值
count       分組中非NA值的數(shù)量
sum         非NA值的和
median      非NA值的算術(shù)中位數(shù)
std         標(biāo)準(zhǔn)差
var         方差
min         非NA值的最小值
max         非NA值的最大值
prod        非NA值的積
first       第一個(gè)非NA值
last        最后一個(gè)非NA值
mad         平均絕對(duì)偏差
mode        模
abs         絕對(duì)值
sem         平均值的標(biāo)準(zhǔn)誤差
skew        樣品偏斜度(三階矩)
kurt        樣品峰度(四階矩)
quantile    樣本分位數(shù)(百分位上的值)
cumsum      累積總和
cumprod     累積乘積
cummax      累積最大值
cum         累積最小值
示例:
df1=pd.DataFrame({'Data1':np.random.randint(0,10,5),
                  'Data2':np.random.randint(10,20,5),
                  'key1':list('aabba'),
                  'key2':list('xyyxy')})
print(df1)
'''
    Data1  Data2 key1 key2
0      5     16    a    x
1      5     11    a    y
2      9     13    b    y
3      4     13    b    x
4      3     16    a    y
'''
# 按key1分組檐束,進(jìn)行聚合計(jì)算
# 注意:當(dāng)分組后進(jìn)行數(shù)值計(jì)算時(shí)误算,不是數(shù)值類(lèi)的列(即麻煩列)會(huì)被清除
print(df1.groupby('key1').sum())
'''
      Data1  Data2
key1              
a         9     47
b         6     30
'''

# 只算data1
print(df1['Data1'].groupby(df1['key1']).sum())
'''
key1
a    13
b     5
Name: Data1, dtype: int32
'''

print(df1.groupby('key1')['Data1'].sum())
'''
key1
a    14
b    12
Name: Data1, dtype: int32
'''

print(df1.groupby('key1')['Data1'].mean())
'''
key1
a    3.0
b    3.5
Name: Data1, dtype: float64
'''
# 使用agg()函數(shù)做聚合運(yùn)算
print(df1.groupby('key1').agg('sum'))

# 可以同時(shí)做多個(gè)聚合運(yùn)算
print(df1.groupby('key1').agg(['sum','mean','std']))
'''
Data1  Data2
key1              
a         9     48
b         7     30

       Data1                Data2               
       sum mean       std   sum mean       std
key1                                          
a        9  3.0  4.358899    48   16  3.000000
b        7  3.5  4.949747    30   15  4.242641
'''

# 可自定義函數(shù),傳入agg方法中 grouped.agg(func)
def peak_range(df):
    """
        返回?cái)?shù)值范圍
    """
    return df.max() - df.min()

print(df1.groupby('key1').agg(peak_range))
'''
        Data1  Data2
key1              
a         8      6
b         7      6

此次:df為
     Data1  Data2 key1 key2
0      8     13    a    x
1      0     19    a    y
2      7     12    b    y
3      0     18    b    x
4      1     16    a    y
'''

#同時(shí)應(yīng)眵個(gè)聚合函數(shù)
print(df1.groupby('key1').agg(['mean','std','count',peak range])) #默認(rèn)列名為函數(shù)名
print(df1.groupby('key1').agg(['mean','std','count',('range', peak_range)])) #通過(guò)元組提供新的列名
拓展apply()函數(shù)
df1=pd.DataFrame({'sex':list('FFMFMMF'),'smoker':list('YNYYNYY'),'age':[21,30,17,37,40,18,26],'weight':[120,100,132,140,94,89,123]})
print(df1)
'''
   sex smoker  age  weight
0   F      Y   21     120
1   F      N   30     100
2   M      Y   17     132
3   F      Y   37     140
4   M      N   40      94
5   M      Y   18      89
6   F      Y   26     123
'''

def bin_age(age):
    if age >=18:
        return 1
    else:
        return 0

# 抽煙的年齡大于等18的
print(df1['age'].apply(bin_age))
'''
0    1
1    1
2    0
3    1
4    1
5    1
6    1
Name: age, dtype: int64
'''

df1['age'] = df1['age'].apply(bin_age)
print(df1)
'''
  sex smoker  age  weight
0   F      Y    1     120
1   F      N    1     100
2   M      Y    0     132
3   F      Y    1     140
4   M      N    1      94
5   M      Y    1      89
6   F      Y    1     123
'''

# 取出抽煙和不抽煙的體重前二
def top(smoker,col,n=5):
    return smoker.sort_values(by=col)[-n:]

df1.groupby('smoker').apply(top,col='weight',n=2)
'''
       sex  smoker  age weight
smoker                  
N   4   M   N       1       94
1       F   N       1       100
Y   2   M   Y       0       132
3       F   Y       1       140
'''
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末担锤,一起剝皮案震驚了整個(gè)濱河市蔚晨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肛循,老刑警劉巖铭腕,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異多糠,居然都是意外死亡累舷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)夹孔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)被盈,“玉大人,你說(shuō)我怎么就攤上這事析蝴『Σ叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵闷畸,是天一觀的道長(zhǎng)尝盼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)佑菩,這世上最難降的妖魔是什么盾沫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮殿漠,結(jié)果婚禮上赴精,老公的妹妹穿的比我還像新娘。我一直安慰自己绞幌,他們只是感情好蕾哟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著莲蜘,像睡著了一般谭确。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上票渠,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天逐哈,我揣著相機(jī)與錄音,去河邊找鬼问顷。 笑死昂秃,一個(gè)胖子當(dāng)著我的面吹牛禀梳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肠骆,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼算途,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哗戈?” 一聲冷哼從身側(cè)響起郊艘,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唯咬,沒(méi)想到半個(gè)月后纱注,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胆胰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年狞贱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜀涨。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞎嬉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厚柳,到底是詐尸還是另有隱情氧枣,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布别垮,位于F島的核電站便监,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碳想。R本人自食惡果不足惜烧董,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胧奔。 院中可真熱鬧逊移,春花似錦、人聲如沸龙填。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岩遗。三九已至胶背,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喘先,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工廷粒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窘拯,地道東北人红且。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涤姊,于是被迫代替她去往敵國(guó)和親暇番。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359