熊猫如何循环通过MultiIndex系列

时间:2016-12-15 08:35:14

标签: python pandas

我的MultiIndex系列看起来像这样:

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

此MultiIndex有两个级别,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 个答案:

答案 0 :(得分:2)

您可以使用groupby并将lambda函数应用于展平length的{​​{1}} - 有关详细信息,请参阅answer

lists

相反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