在資料庫中,我們可以對資料進行分類,聚合運算。例如groupby
操作。在
pandas
中同樣也有類似的功能。通過這些聚合,分組操作,我們可以很容易的對資料進行轉換,清洗,運算。比如如下圖,首先通過不同的鍵值進行分類,然後對各個分類進行求和運算。
我們來看實際的例子,首先生成一組資料如下
df=dataframe()
data1 data2 key1 key2
0 0.426519 0.321085 a one
1 0.918215 0.418922 a two
2 -2.792968 0.629589 b one
3 -0.431760 0.231652 b two
4 0.570083 -0.799304 a one
然後針對data1
列根據key1
的值來進行分組
groupd=df['data1'].groupby(df['key1'])
得到groupd
只是乙個聚合的物件,我們可以在這個物件上進行各種運算。比如
groupd.mean(), groupd.sum()
分別代表平均數,求和。結果如下,生成了乙個新的資料列,且列名還是
key1
key1
a 0.146577
b -0.947097
name: data1, dtype: float64
key1
a 0.439730
b -1.894193
name: data1, dtype: float64
在groupby
中還可以傳遞多個陣列,比如
groupd1=df['data1'].groupby([df['key1'],df['key2']]).sum()
結果如下:通過key1
列進行聚合後,在通過
key2
列對之前的資料再聚合
. 然後求和。
key1 key2
a one -0.115901
two -0.030998
b one -0.039265
two 0.295743
name: data1, dtype: float64
當然還可以將列名也用作分組鍵。
df.groupby(df['key1']).mean()
data1 data2
key1
a 0.381235 0.453622
b -0.179429 -0.880869
df.groupby([df['key1'],df['key2']]).mean()
data1 data2
key1 key2
a one 0.466122 0.328501
two 0.211462 0.703865
b one 0.848630 -0.598706
two -1.207488 -1.163033
通過上面的結果可以看到通過key1
進行分組的時候
key2
列是不存在的,這是因為
key2
列不是整數資料。所以從結果中排除了。
對元組進行迭代
前面通過df.groupby(df[『key1』])
進行分組的時候,我們其實得到了兩類分組,一種是
a的分組,一種是
b的分組。因為在
key1
列中只有這
2個值,如果我們想分別訪問這兩組分組的資料,就需要用到迭代了。
for group1,group2 in df.groupby(df['key1']):
print group1,group2
這樣就分別得到了針對a,b
的各自分組。
a data1 data2 key1 key2
0 -0.973337 0.656690 a one
1 0.930285 -2.361232 a two
4 -0.195729 -0.717847 a one
b data1 data2 key1 key2
2 -0.167785 -0.907817 b one
3 -2.245887 -0.170275 b two
對於多列的分組:
for group1,group2 in df.groupby([df['key1'],df['key2']]):
print group1
print group2
結果如下,總共有4
個分組。分別是
(『a』,』one』),(『a』,』two』),(『b』,』one』),(『b』,』two』)
('a', 'one')
data1 data2 key1 key2
0 -0.430579 -0.810844 a one
4 0.481271 -0.998662 a one
('a', 'two')
data1 data2 key1 key2
1 -0.114657 1.062592 a two
('b', 'one')
data1 data2 key1 key2
2 -0.996202 0.661732 b one
('b', 'two')
data1 data2 key1 key2
3 0.812372 -1.09057 b two
下面總結一下groupby
的聚合運算的方法:
首先在group_by_test
中,通過
pd.cut
將frame進行4
分位分隔。然後對各個分位進行聚合。最後通過
函式對各個分組呼叫
get_stats
函式。這個函式的作用和下面的**的作用是一樣的。
for g in frame.data2.groupbyby(facotr):
get_stats(g)
隨機取樣和排列:
假設想要從乙個大資料集中隨機抽樣樣本進行分析工作。np.random.permutation(n)
選取前k
個元素, 其中n
為完整資料的大小,
k為期望的樣本大小。下面舉乙個撲克牌的例子
def draw(deck,n=5):
return deck.take(np.random.permutation(len(deck))[:n])
def group_by_test2():
card_val=(range(1,11)+[10]*3)*4 #牌的序號
base_name=['a']+range(2,11)+['j','k','q'] #牌名
cards=
suits=['h','s','c','d'] #花色:紅桃
(hearts)
,黑桃(spades),
梅花(clubs)
,方片(diamonds)
for suit in ['h','s','c','d']:
cards.extend(str(num)+suit for num in base_name) #產生牌
deck=series(card_val,index=cards)
get_suit=lambda card:card[-1] #根據牌名最後乙個字元也就是花色進行分組。
執行結果:
c 8c 8
9c 9
d kd 10
qd 10
h 5h 5
9h 9
s 7s 7
js 10
dtype: int64
Python資料分析之資料清洗
good data decides good analyse 資料清洗,是資料分析中不可缺少的乙個環節,其處理的好壞在很大程度上影響著資料分析的結果。而且以前聽老師說過資料清洗佔整個的資料分析的一半時間以上 汗。資料清洗也是乙個大學問啊 首先讀入檔案 我們可以看出有乙個nan,李四的數學成績也是不符...
Python之資料分析(寶可夢資料分析)
在此感謝阿里雲天池平台提供的學習平台,並提供相應的教程供小白們學習資料分析。seaborn庫 seaborn 是基於 python 且非常受歡迎的圖形視覺化庫,在 matplotlib 的基礎上,進行了更高階的封裝,使得作圖更加方便快捷。即便是沒有什麼基礎的人,也能通過極簡的 做出具有分析價值而又十...
python資料分析之Numpy
numpy系統是python的一種開源的數值計算擴充套件 ndarray 多維陣列 所有元素必須是相同型別 ndim屬性,維度個數 shape屬性,各維度大小 dtype屬性,資料型別 coding utf 8 import numpy as np 生成指定維度的隨機多維資料 data np.ran...