2013-03-29 46 views

回答

3

呼叫GROUPBY兩次 「K1」 和( 「K1」, 「K2」),然後執行div

import pandas as pd 
k1 = ["a", "a", "a", "a", "b", "b", "b"] 
k2 = ["x", "x", "y", "y", "x", "y", "y"] 
df = pd.DataFrame({"k1":k1, "k2":k2}) 

df.groupby(["k1", "k2"]).k2.count().div(
    df.groupby("k1").k1.count().astype(float), level=0) 

輸出:

k1 k2 
a x  0.500000 
    y  0.500000 
b x  0.333333 
    y  0.666667 
6

下面是一個使用一個GROUPBY的替代方法聲明。

按k1分組,選擇列k2並應用lambda函數。拉姆達獲取頻率計數K2 的每個級別 K1內,然後我們通過K1的計分:

In [1]: df.groupby('k1')['k2'].apply(lambda x: pd.value_counts(x)/x.count().astype(float)) 

Out[1]: 
k1 
a x 0.500000 
    y 0.500000 
b y 0.666667 
    x 0.333333 

性能:

HYRY的方法:

100 loops, best of 3: 3.07 ms per loop 

我的方法:

1000 loops, best of 3: 1.98 ms per loop 
+0

謝謝,這就是我一直在尋找的東西。 – gus

+0

嗨@gus,如果這是你正在尋找的答案,這將有助於接受它。 – Will