我的MultiIndex系列看起来像这样:
user_id cookie browser
1 1_1 [chrome45]
2 2_1 [IE 7]
2 2_2 [IE 7, IE 8]
此MultiIndex有两个级别,user_id
和cookie
。值是浏览器。
我想要做的是计算用户使用其他浏览器的次数。
因此对于这种情况下的用户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
答案 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