一肢娘、層級索引
下面創(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值