Python13--數(shù)據(jù)分析Pandas庫進(jìn)階二

一肢娘、層級索引

下面創(chuàng)建一個Series缸逃, 在輸入索引Index時厨疙,輸入了由兩個子list組成的list,第一個子list是外層索引欧瘪,第二個list是內(nèi)層索引囚衔。

示例代碼:

# 導(dǎo)入numpy挖腰,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
print(ser_obj)

顯示結(jié)果:


層級索引

1练湿,MultiIndex索引對象

打印這個Series的索引類型猴仑,顯示是MultiIndex
直接將索引打印出來,可以看到有l(wèi)avels,和labels兩個信息肥哎。lavels表示兩個層級中分別有那些標(biāo)簽宁脊,labels是每個位置分別是什么標(biāo)簽。

示例代碼:

# 導(dǎo)入numpy贤姆,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
print(type(ser_obj.index))
print(ser_obj.index)

顯示結(jié)果:


MultiIndex索引對象

2稳衬,選取子集

根據(jù)索引獲取數(shù)據(jù)霞捡。因?yàn)楝F(xiàn)在有兩層索引,當(dāng)通過外層索引獲取數(shù)據(jù)的時候薄疚,可以直接利用外層索引的標(biāo)簽來獲取碧信。
當(dāng)要通過內(nèi)層索引獲取數(shù)據(jù)的時候,在list中傳入兩個元素街夭,前者是表示要選取的外層索引砰碴,后者表示要選取的內(nèi)層索引。

(1)外層選取

語法格式:ser_obj['outer_label']

示例代碼:

# 導(dǎo)入numpy板丽,別名np
import numpy as np
# 導(dǎo)入pandas呈枉,別名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
# 外層選取
print(ser_obj['c'])

顯示結(jié)果:


外層選取

(2)內(nèi)層選取

語法格式:ser_obj[:, 'inner_label']

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas埃碱,別名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
# 內(nèi)層選取
print(ser_obj[:, 2])

顯示結(jié)果:


內(nèi)層選取

3猖辫,交換分層順序

swaplevel():.swaplevel( )交換內(nèi)層與外層索引。

示例代碼:

# 導(dǎo)入numpy砚殿,別名np
import numpy as np
# 導(dǎo)入pandas啃憎,別名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
print(ser_obj.swaplevel())

顯示結(jié)果:


交換分層順序

4,交換并排序分層

sortlevel():.sortlevel( )先對外層索引進(jìn)行排序似炎,再對內(nèi)層索引進(jìn)行排序辛萍,默認(rèn)是升序悯姊。
但是pandas的包中在0.23.4版本中就取消了sort方法,老版本的Series和DataFrame對象中還包含這個函數(shù)贩毕,新版本中推薦使用sort_index和sort_values函數(shù)悯许。
所以應(yīng)該首先查看自己的版本,然后選取對應(yīng)的函數(shù)對索引進(jìn)行排序耳幢。

示例代碼:

# 導(dǎo)入numpy岸晦,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
# 交換并排序分層
print(ser_obj.swaplevel().sort_index())

顯示結(jié)果:


交換并排序分層

二睛藻、統(tǒng)計(jì)計(jì)算和描述

1启上,常用的統(tǒng)計(jì)計(jì)算

sum, mean, max, min…
axis=0 按列統(tǒng)計(jì),axis=1按行統(tǒng)計(jì)
skipna 排除缺失值店印, 默認(rèn)為True

示例代碼:

# 導(dǎo)入numpy冈在,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
print(df_obj)

print(df_obj.sum())
print(df_obj.max())
print(df_obj.min(axis=1, skipna=False))

顯示結(jié)果:


常用的統(tǒng)計(jì)計(jì)算

2按摘,常用的統(tǒng)計(jì)描述

describe 產(chǎn)生多個統(tǒng)計(jì)數(shù)據(jù)

示例代碼:

# 導(dǎo)入numpy包券,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
print(df_obj)

print(df_obj.describe())

顯示結(jié)果:


常用的統(tǒng)計(jì)描述

3炫贤,常用的統(tǒng)計(jì)描述方法

方法 說明
count 非NA值的數(shù)量
describe 針對DataFrame與Series計(jì)算匯總統(tǒng)計(jì)
min溅固、max 計(jì)算最大值與最小值
argmin、argmax 計(jì)算能夠獲取到的最大值與最小值的索引位置
idxmin兰珍、idmax 計(jì)算能夠獲取到的最大值與最小值的索引值
quantile 計(jì)算樣本的分位數(shù)
sum 值的總和
mean 值的平均值
median 值的算術(shù)中位數(shù)
mad 根據(jù)平均值計(jì)算平均絕對離差
var 樣本值的方差
std 樣本值的標(biāo)準(zhǔn)差
skew 樣本值的偏度
kurt 樣本值的峰度
cumsum 樣本值的累計(jì)和
cummin侍郭、cummax 樣本值的累計(jì)最大值與累計(jì)最小值
cumprod 樣本值的累計(jì)積
diff 計(jì)算一階差分(一般使用在時間序列中)
pct_change 計(jì)算百分比的變化

三、分組

定義:對數(shù)據(jù)集進(jìn)行分組掠河,然后對每組進(jìn)行統(tǒng)計(jì)分析亮元;SQL能夠?qū)?shù)據(jù)進(jìn)行過濾,分組聚合唠摹;pandas能利用groupby進(jìn)行更加復(fù)雜的分組運(yùn)算爆捞。
分組運(yùn)算過程:split->apply->combine
    拆分:進(jìn)行分組的根據(jù)
    應(yīng)用:每個分組運(yùn)行的計(jì)算規(guī)則
    合并:把每個分組的計(jì)算結(jié)果合并起來

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas勾拉,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)
print(df_obj)

顯示結(jié)果:


分組

1煮甥,GroupBy對象:DataFrameGroupBy,SeriesGroupBy

(1)分組操作

groupby()進(jìn)行分組藕赞,GroupBy對象沒有進(jìn)行實(shí)際運(yùn)算苛秕,只是包含分組的中間數(shù)據(jù)。
按列名分組代碼格式:obj.groupby(‘label’)

示例代碼:

# 導(dǎo)入numpy找默,別名np
import numpy as np
# 導(dǎo)入pandas艇劫,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# dataframe根據(jù)key1進(jìn)行分組
print(type(df_obj.groupby('key1')))

# dataframe的 data1 列根據(jù) key1 進(jìn)行分組
print(type(df_obj['data1'].groupby(df_obj['key1'])))

顯示結(jié)果:


分組操作

(2)分組運(yùn)算

對GroupBy對象進(jìn)行分組運(yùn)算/多重分組運(yùn)算,如mean()
非數(shù)值數(shù)據(jù)不進(jìn)行分組運(yùn)算
size() 返回每個分組的元素個數(shù)

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas店煞,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 分組運(yùn)算
grouped1 = df_obj.groupby('key1')
print(grouped1.mean())

grouped2 = df_obj['data1'].groupby(df_obj['key1'])
print(grouped2.mean())

print(grouped1.size())
print(grouped2.size())

顯示結(jié)果:


分組運(yùn)算

(3)按自定義的key分組

語法格式:obj.groupby(self_def_key)
自定義的key可為列表或多層列表
obj.groupby([‘label1’, ‘label2’])->多層dataframe

示例代碼:

# 導(dǎo)入numpy蟹演,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組顷蟀,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print(df_obj.groupby(self_def_key).size())

# 按自定義key分組酒请,多層列表
print(df_obj.groupby([df_obj['key1'], df_obj['key2']]).size())

# 按多個列多層分組
grouped2 = df_obj.groupby(['key1', 'key2'])
print(grouped2.size())

# 多層分組按key的順序進(jìn)行
grouped3 = df_obj.groupby(['key2', 'key1'])
print(grouped3.mean())
# unstack可以將多層索引的結(jié)果轉(zhuǎn)換成單層的dataframe
print(grouped3.mean().unstack())

顯示結(jié)果:


按自定義的key分組

2,GroupBy對象支持迭代操作

每次迭代返回一個元組 (group_name, group_data)
可用于分組數(shù)據(jù)的具體運(yùn)算

(1)單層分組

示例代碼:

# 導(dǎo)入numpy鸣个,別名np
import numpy as np
# 導(dǎo)入pandas羞反,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print(df_obj.groupby(self_def_key).size())

grouped1 = df_obj.groupby('key1')
# print(grouped1.mean())

grouped2 = df_obj['data1'].groupby(df_obj['key1'])
# print(grouped2.mean())
# 單層分組囤萤,根據(jù)key1
for group_name, group_data in grouped1:
    print(group_name)
    print(group_data)

顯示結(jié)果:


單層分組

(2)多層分組

示例代碼:

# 導(dǎo)入numpy昼窗,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組涛舍,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print(df_obj.groupby(self_def_key).size())

grouped1 = df_obj.groupby('key1')
# print(grouped1.mean())

# 按多個列多層分組
grouped2 = df_obj.groupby(['key1', 'key2'])
#print(grouped2.size())

# 多層分組澄惊,根據(jù)key1 和 key2
for group_name, group_data in grouped2:
    print(group_name)
    print(group_data)

顯示結(jié)果:


多層分組

3,GroupBy對象可以轉(zhuǎn)換成列表或字典

(1)GroupBy對象可以轉(zhuǎn)換成列表或字典

(2)按列分組富雅、按數(shù)據(jù)類型分組

示例代碼:

# 導(dǎo)入numpy掸驱,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組没佑,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print(df_obj.groupby(self_def_key).size())

grouped1 = df_obj.groupby('key1')
# print(grouped1.mean())

# 按多個列多層分組
grouped2 = df_obj.groupby(['key1', 'key2'])
#print(grouped2.size())

# 按列分組
print(df_obj.dtypes)

# 按數(shù)據(jù)類型分組
print(df_obj.groupby(df_obj.dtypes, axis=1).size())
print(df_obj.groupby(df_obj.dtypes, axis=1).sum())

顯示結(jié)果:


按列分組毕贼、按數(shù)據(jù)類型分組

(3)通過字典分組

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas蛤奢,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組帅刀,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
#print(df_obj.groupby(self_def_key).size())

grouped1 = df_obj.groupby('key1')
# print(grouped1.mean())

# 按多個列多層分組
grouped2 = df_obj.groupby(['key1', 'key2'])
#print(grouped2.size())

df_obj2 = pd.DataFrame(np.random.randint(1, 10, (5,5)),
                       columns=['a', 'b', 'c', 'd', 'e'],
                       index=['A', 'B', 'C', 'D', 'E'])
# 通過字典分組
mapping_dict = {'a':'Python', 'b':'Python', 'c':'Java', 'd':'C', 'e':'Java'}
print(df_obj2.groupby(mapping_dict, axis=1).size())
print(df_obj2.groupby(mapping_dict, axis=1).count()) # 非NaN的個數(shù)
print(df_obj2.groupby(mapping_dict, axis=1).sum())

顯示結(jié)果:


通過字典分組

(4)通過函數(shù)分組,函數(shù)傳入的參數(shù)為行索引或列索引

示例代碼:

# 導(dǎo)入numpy远剩,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組骇窍,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
#print(df_obj.groupby(self_def_key).size())

grouped1 = df_obj.groupby('key1')
# print(grouped1.mean())

# 按多個列多層分組
grouped2 = df_obj.groupby(['key1', 'key2'])
#print(grouped2.size())

# 通過函數(shù)分組
df_obj3 = pd.DataFrame(np.random.randint(1, 10, (5,5)),
                       columns=['a', 'b', 'c', 'd', 'e'],
                       index=['AA', 'BBB', 'CC', 'D', 'EE'])
#df_obj3

def group_key(idx):
    """
        idx 為列索引或行索引
    """
    #return idx
    return len(idx)

print(df_obj3.groupby(group_key).size())

# 以上自定義函數(shù)等價(jià)于
#df_obj3.groupby(len).size()

顯示結(jié)果:


通過函數(shù)分組瓜晤,函數(shù)傳入的參數(shù)為行索引或列索引

(5)通過索引級別分組

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas腹纳,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randn(8),
            'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)

# 按自定義key分組痢掠,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
#print(df_obj.groupby(self_def_key).size())

# 通過索引級別分組
columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],
                                     ['A', 'A', 'B', 'C', 'B']], names=['language', 'index'])
df_obj4 = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
print(df_obj4)

# 根據(jù)language進(jìn)行分組
print(df_obj4.groupby(level='language', axis=1).sum())
# 根據(jù)index進(jìn)行分組
print(df_obj4.groupby(level='index', axis=1).sum())

顯示結(jié)果:


通過索引級別分組

四,聚合

數(shù)組產(chǎn)生標(biāo)量的過程嘲恍,如mean()足画、count()等
常用于對分組后的數(shù)據(jù)進(jìn)行計(jì)算

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas佃牛,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1,10, 8),
            'data2': np.random.randint(1,10, 8)}
df_obj5 = pd.DataFrame(dict_obj)
print(df_obj5)

顯示結(jié)果:


聚合示例

1淹辞,內(nèi)置的聚合函數(shù)

sum(), mean(), max(), min(), count(), size(), describe()

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas俘侠,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1,10, 8),
            'data2': np.random.randint(1,10, 8)}
df_obj5 = pd.DataFrame(dict_obj)

print(df_obj5.groupby('key1').sum())
print(df_obj5.groupby('key1').max())
print(df_obj5.groupby('key1').min())
print(df_obj5.groupby('key1').mean())
print(df_obj5.groupby('key1').size())
print(df_obj5.groupby('key1').count())
print(df_obj5.groupby('key1').describe())

顯示結(jié)果:


內(nèi)置的聚合函數(shù)

2象缀,可自定義函數(shù)蔬将,傳入agg方法中

grouped.agg(func)
func的參數(shù)為groupby索引對應(yīng)的記錄

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas央星,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1,10, 8),
            'data2': np.random.randint(1,10, 8)}
df_obj = pd.DataFrame(dict_obj)
df_obj5 = pd.DataFrame(dict_obj)

# 自定義聚合函數(shù)
def peak_range(df):
    """
        返回?cái)?shù)值范圍
    """
    #print type(df) #參數(shù)為索引所對應(yīng)的記錄
    return df.max() - df.min()

print(df_obj5.groupby('key1').agg(peak_range))
print(df_obj.groupby('key1').agg(lambda df : df.max() - df.min()))

顯示結(jié)果:


自定義函數(shù)

3霞怀,應(yīng)用多個聚合函數(shù)

同時應(yīng)用多個函數(shù)進(jìn)行聚合操作,使用函數(shù)列表

示例代碼:

# 導(dǎo)入numpy莉给,別名np
import numpy as np
# 導(dǎo)入pandas毙石,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1,10, 8),
            'data2': np.random.randint(1,10, 8)}
df_obj = pd.DataFrame(dict_obj)
df_obj5 = pd.DataFrame(dict_obj)

# 自定義聚合函數(shù)
def peak_range(df):
    """
        返回?cái)?shù)值范圍
    """
    #print type(df) #參數(shù)為索引所對應(yīng)的記錄
    return df.max() - df.min()

# 應(yīng)用多個聚合函數(shù)

# 同時應(yīng)用多個聚合函數(shù)
print(df_obj.groupby('key1').agg(['mean', 'std', 'count', peak_range])) # 默認(rèn)列名為函數(shù)名

print(df_obj.groupby('key1').agg(['mean', 'std', 'count', ('range', peak_range)])) # 通過元組提供新的列名

顯示結(jié)果:


應(yīng)用多個聚合函數(shù)

4,對不同的列分別作用不同的聚合函數(shù)颓遏,使用dict

示例代碼:

# 導(dǎo)入numpy徐矩,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1,10, 8),
            'data2': np.random.randint(1,10, 8)}
df_obj = pd.DataFrame(dict_obj)
df_obj5 = pd.DataFrame(dict_obj)

# 每列作用不同的聚合函數(shù)
dict_mapping = {'data1':'mean',
                'data2':'sum'}
print(df_obj.groupby('key1').agg(dict_mapping))

dict_mapping = {'data1':['mean','max'],
                'data2':'sum'}
print(df_obj.groupby('key1').agg(dict_mapping))

顯示結(jié)果:


不同的列分別作用不同的聚合函數(shù)

5州泊,常用的內(nèi)置聚合函數(shù)

函數(shù)名 說明
count 分組中非NA的數(shù)量
sum 非NA的和
mean 非NA值的平均值
median 非NA值的算數(shù)中位數(shù)
std丧蘸、var 標(biāo)準(zhǔn)差和方差
min、max 非NA值的最大值和最小值
prod 非NA值的積
first遥皂、last 第一個或者最后一個非NA值

五力喷、數(shù)據(jù)的分組運(yùn)算

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas演训,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1, 10, 8),
            'data2': np.random.randint(1, 10, 8)}
df_obj = pd.DataFrame(dict_obj)
print(df_obj)

# 按key1分組后弟孟,計(jì)算data1,data2的統(tǒng)計(jì)信息并附加到原始表格中样悟,并添加表頭前綴
k1_sum = df_obj.groupby('key1').sum().add_prefix('sum_')
print(k1_sum)

顯示結(jié)果:


數(shù)據(jù)的分組運(yùn)算

1拂募,merge

示例代碼:

# 導(dǎo)入numpy,別名np
import numpy as np
# 導(dǎo)入pandas窟她,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1, 10, 8),
            'data2': np.random.randint(1, 10, 8)}
df_obj = pd.DataFrame(dict_obj)
#print(df_obj)
k1_sum = df_obj.groupby('key1').sum().add_prefix('sum_')
# 方法1陈症,使用merge
k1_sum_merge = pd.merge(df_obj, k1_sum, left_on='key1', right_index=True)
print(k1_sum_merge)

顯示結(jié)果:


merge

2,transform

transform的計(jì)算結(jié)果和原始數(shù)據(jù)的形狀保持一致震糖,

示例代碼:

# 導(dǎo)入numpy录肯,別名np
import numpy as np
# 導(dǎo)入pandas,別名 pd
import pandas as pd

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1, 10, 8),
            'data2': np.random.randint(1, 10, 8)}
df_obj = pd.DataFrame(dict_obj)
#print(df_obj)
k1_sum = df_obj.groupby('key1').sum().add_prefix('sum_')
# 方法2吊说,使用transform
k1_sum_tf = df_obj.groupby('key1').transform(np.sum).add_prefix('sum_')
df_obj[k1_sum_tf.columns] = k1_sum_tf
print(df_obj)

顯示結(jié)果:


transform

六论咏、聚類模型:K-Means

1,K-Means算法

算法接收參數(shù)k颁井;然后將樣本點(diǎn)劃分為k個聚類厅贪;同一聚類中的樣本相似度較高;不同聚類中的樣本相似度較小

2雅宾,算法思想

以空間中k個樣本點(diǎn)為中心進(jìn)行聚類养涮,對最靠近它們的樣本點(diǎn)歸類。通過迭 代的方法,逐步更新各聚類中心单寂,直至達(dá)到最好的聚類效果

3贬芥,算法描述

(1)選擇k個聚類的初始中心
(2)在第n次迭代中,對任意一個樣本點(diǎn)宣决,求其到k個聚類中心的距離蘸劈,將該 樣本點(diǎn)歸類到距離最小的中心所在的聚類
(3)利用均值等方法更新各類的中心值
(4)對所有的k個聚類中心,如果利用2,3步的迭代更新后尊沸,達(dá)到穩(wěn)定威沫,則迭代 結(jié)束。

4洼专,優(yōu)缺點(diǎn)

優(yōu)點(diǎn):速度快棒掠,簡單
缺點(diǎn):最終結(jié)果和初始點(diǎn)的選擇相關(guān),容易陷入局部最優(yōu)屁商,需要給定k值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烟很,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜡镶,更是在濱河造成了極大的恐慌雾袱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件官还,死亡現(xiàn)場離奇詭異芹橡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)望伦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門林说,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屯伞,你說我怎么就攤上這事腿箩。” “怎么了劣摇?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵珠移,是天一觀的道長。 經(jīng)常有香客問我饵撑,道長,這世上最難降的妖魔是什么唆貌? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任滑潘,我火速辦了婚禮,結(jié)果婚禮上锨咙,老公的妹妹穿的比我還像新娘语卤。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布粹舵。 她就那樣靜靜地躺著钮孵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眼滤。 梳的紋絲不亂的頭發(fā)上巴席,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音诅需,去河邊找鬼漾唉。 笑死,一個胖子當(dāng)著我的面吹牛堰塌,可吹牛的內(nèi)容都是我干的赵刑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼场刑,長吁一口氣:“原來是場噩夢啊……” “哼般此!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牵现,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铐懊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后施籍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體居扒,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年丑慎,在試婚紗的時候發(fā)現(xiàn)自己被綠了喜喂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡竿裂,死狀恐怖玉吁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腻异,我是刑警寧澤进副,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站悔常,受9級特大地震影響影斑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机打,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一矫户、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧残邀,春花似錦皆辽、人聲如沸柑蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耻台。三九已至,卻和暖如春空另,著一層夾襖步出監(jiān)牢的瞬間盆耽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工痹换, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留征字,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓娇豫,卻偏偏與公主長得像匙姜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冯痢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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