2017-04-11 109 views
1

我有一个列表像这样的:蟒蛇大熊猫:子表的列表:总项目数

categories_list = [ 
    ['a', array([ 12994, 1262824, 145854, 92469]), 
    'b', array([273300]), 
    'c', array([341395, 32857711])], 
    ['a', array([ 356424311, 165573412, 2032850784]), 
    'b', array([2848105, 228835]), 
    'c', array([])], 
    ['a', array([1431689, 30655043, 1739919]), 
    'b', array([597, 251911, 246600]), 
    'c', array([35590])] 
] 

其中每个阵列之前所属的信。 例如:a -> array([ 12994, 1262824, 145854, 92469]), b -> array([273300]), 'a' -> array([1431689, 30655043, 1739919]) and so on...

那么,是否有可能检索每个字母的总项目编号? 必要条件:

---------- 
a  10 
b  6 
c  3 

所有建议,欢迎

回答

1
pd.DataFrame(
    [dict(zip(x[::2], [len(y) for y in x[1::2]])) for x in categories_list] 
).sum() 

a 10 
b  6 
c  3 
dtype: int64 

  • 我的目标是创造一个字典列表。所以,我必须填写......的东西,分析与字典中的每个子列表

    [ ...... for x in catgories_list] 
    
  • 如果我的列表或tuples发电机上使用dict,它会神奇地把它转换成一个字典,键为元组中的第一个值和值作为元组中的第二个值。

    dict(...list of tuples...) 
    
  • zip会给我的tuples

    zip(list one, list two) 
    
  • 我知道,在每个子列表,我的钥匙都在偶数指数[0, 2, 4...]和值在奇数索引即生成[1, 3, 5, ...]

    # even odd 
    zip(x[::2], x[1::2]) 
    
  • 但是x[1::2]将是数组,而我不想要数组。我想要数组的长度。

    # even      odd 
    zip(x[::2], [len(y) for y in x[1::2]]) 
    
  • pandas.DataFrame将采取词典列表,并创建一个数据帧。

  • 最后,使用sum来计算长度。

+0

非常感谢您的详细解释,piRSquared – nickerox

0

我使用groupby为了组密钥中柱0, 2, 4(其具有分别键abc),然后计数在的不同的项数编号下一列。在这种情况下,组中的号码是len(set(group))(或者如果您只想要组的总长度,则为len(group))。请参见下面的代码:

from itertools import groupby, chain 

count_distincts = [] 
cols = [0, 2, 4] 
for c in cols: 
    for gid, group in groupby(categories_list, key=lambda x: x[c]): 
     group = list(chain(*[list(g[c + 1]) for g in group])) 
     count_distincts.append([gid, len(set(group))]) 

输出[['a', 10], ['b', 6], ['c', 3]]