2016-08-18 151 views
3

假设我有一个pandasSeries,像这样:三重嵌套字典理解?

import pandas as pd 
s = pd.Series(["hello go home bye bye", "you can't always get", "what you waaaaaaant", "apple banana carrot munch 123"]) 

我想创建一个单个字符键,和它们的频率为值的字典。创建这些字典在过去的话一直是容易的collections.Counter的帮助:

from collections import Counter 
c = Counter(word for row in s for word in row.lower().split()) 

不过,我现在尝试存储单个字符时遇到三重嵌套字典推导的一些问题。这是我有:

c = Counter((letter for letter in word) for word for row in s for word in row.lower().split()) 

这给我一个语法错误。我怎样才能使一行中的以下for循环的等价物?

d = {} 
for row in s: 
    for word in row.lower().split(): 
     for letter in word: 
      d[letter] += 1 
+0

你似乎有一个错字:'用于字行'我不应该有** ** –

回答

2

我认为你可以使用

Counter([j for i in s for j in i]) 
Counter({'a': 16, ' ': 13, 'e': 6, 'o': 6, 'n': 5, 't': 5, 'y': 5, 'h': 4, 'l': 4, 'c': 3, 'b': 3, 'u': 3, 'w': 3, 'g': 2, 'm': 2, 'p': 2, 'r': 2, "'": 1, '1': 1, '3': 1, '2': 1, 's': 1}) 

得到个别字符数。

+0

我看到。对于单个字符,不需要运行split(),因为单词不相关。 – blacksite

2

刚及格)每个单词调用.lower(压扁列表清单:

import pandas as pd 
s = pd.Series(["hello go home bye bye", "you can't always get", "what you waaaaaaant", "apple banana carrot munch 123"]) 
from collections import Counter 


print(Counter(word.lower() for row in s for word in row)) 

或链配图:

from collections import Counter 
from itertools import chain 

print(Counter(chain.from_iterable(map(str.lower, s)))) 

两个会给你:

Counter({'a': 16, ' ': 13, 'e': 6, 'o': 6, 'n': 5, 't': 5, 'y': 5, 'h': 4, 'l': 4, 'c': 3, 'b': 3, 'u': 3, 'w': 3, 'g': 2, 'm': 2, 'p': 2, 'r': 2, "'": 1, '1': 1, '3': 1, '2': 1, 's': 1}) 

您也可以使用applys.str.lower()

print(Counter(chain.from_iterable(s.apply(str.lower)))) 
print(Counter(chain.from_iterable(s.str.lower()))) 
2

使用熊猫:

n [6]: pd.Series(list(''.join(s))).value_counts() 
Out[6]: 
a 16 
    13 
e  6 
o  6 
n  5 
t  5 
y  5 
h  4 
l  4 
u  3 
b  3 
c  3 
w  3 
p  2 
m  2 
r  2 
g  2 
1  1 
s  1 
'  1 
2  1 
3  1 
dtype: int64 

In [7]: dict(pd.Series(list(''.join(s))).value_counts()) 
Out[7]: 
{' ': 13, 
"'": 1, 
'1': 1, 
'2': 1, 
'3': 1, 
'a': 16, 
'b': 3, 
'c': 3, 
'e': 6, 
'g': 2, 
'h': 4, 
'l': 4, 
'm': 2, 
'n': 5, 
'o': 6, 
'p': 2, 
'r': 2, 
's': 1, 
't': 5, 
'u': 3, 
'w': 3, 
'y': 5} 
1

你想这样的:

dict(zip([letter for row in s for word in row.lower().split() for letter in word], range(len([letter for row in s for word in row.lower().split() for letter in word]))))