2016-12-15 61 views
0

環有一個多指標系列是這樣的:熊貓我如何通過多指標系列

user_id cookie browser 
1  1_1  [chrome45] 
2  2_1  [IE 7] 
2  2_2  [IE 7, IE 8] 

有兩個層次多指標本,user_idcookie。值是瀏覽器。

我想要做的是統計用戶使用不同瀏覽器的次數。

因此對於這種情況下的用戶1,他只使用了1個瀏覽器。但對於用戶2,他用三種瀏覽器(IE7下不同的Cookie出現了兩次,所以我數了兩次,而不是一次),我怎麼能循環通過它

,並得到這樣的結果:

r = defaultdict(int) 

for user_id in multiIndex_series: 
    for cookie in multiIndex_series[user_id]: 
     r[user_id] += len(multiIndex_series[user_id][cookie]) # I don't know how to get user_id out of the MultiIndex series 

回答

1

您可以使用groupby與應用lambda函數從哪裏得到壓扁listslength - 見answer更多信息:

df = pd.DataFrame({'user_id':[1,2,2], 
        'cookie':['1_1','2_1','2_2'], 
        'browser':[['chrome45'],['IE 7'],['IE 7','IE 8']]}) 
df = df.set_index(['user_id','cookie']) 
print (df) 
        browser 
user_id cookie    
1  1_1  [chrome45] 
2  2_1   [IE 7] 
     2_2  [IE 7, IE 8] 

from itertools import chain 
print (df.groupby(level='user_id')['browser'] 
     .apply(lambda x: len(list(chain.from_iterable(x))))) 
user_id 
1 1 
2 3 
Name: browser, dtype: int64 

相反lambda可以使用自定義函數f用於測試什麼更好的辦法:

def f(x): 
    print (list(chain.from_iterable(x))) 
    return len(list(chain.from_iterable(x))) 

['chrome45'] 
['IE 7', 'IE 7', 'IE 8'] 

print (df.groupby(level='user_id')['browser'].apply(f)) 
user_id 
1 1 
2 3 
Name: browser, dtype: int64 

如果需要一系列的循環,一個可能的解決方案是:

for user_id, val in df['browser'].iteritems(): 
    print (user_id) 
    print (val) 

['chrome45'] 
(2, '2_1') 
['IE 7'] 
(2, '2_2') 
['IE 7', 'IE 8'] 
+0

感謝這麼多的幫助!我不太明白的部分是'chain.from_iterable(x)'中的'x'。這種情況下'x'是什麼?我嘗試打印'x',我可以看到它是整個組。 'chain.from_iterable'如何具體挑選'browser'列? (因爲'groupby(...)['browser']'部分?) – Cheng

+0

如果使用'df.groupby(level ='user_id')['browser']'然後應用某個函數,那麼在每個循環在每個組的'x'變量df ['browser']中。最好的是在'f'函數中測試'def f(x):print(x)' – jezrael

+0

我幾乎在multiIndex.series中爲multiIndex.series.index.level [0]中的user_id做了這個操作[userid ]'。謝謝你救救我:) – Cheng