2016-03-01 4 views
1

У меня есть список биграмм вроде этого:Добавить биграммы в панде dataframe

[['a','b'],['e', ''f']] 

Теперь я хочу, чтобы добавить эти биграммы к DataFrame с их частотами, как это:

b f 
a|1 0 
e|0 1 

Я попытался сделать это со следующим кодом, но это вызывает ошибку, потому что индекс еще не существует. Есть ли быстрый способ сделать это для действительно больших данных? (например, 200000) биграммы

matrixA = pd.DataFrame() 

# Put the counts in a matrix 
for elem in grams: 
    tag1, tag2 = elem[0], elem[1] 
    matrixA.loc[tag1, tag2] += 1 

ответ

2
from collections import Counter 

bigrams = [[['a','b'],['e', 'f']], [['a','b'],['e', 'g']]] 
pairs = [] 
for bg in bigrams: 
    pairs.append((bg[0][0], bg[0][1])) 
    pairs.append((bg[1][0], bg[1][1])) 
c = Counter(pairs) 

>>> pd.Series(c).unstack() # optional: .fillna(0) 
    b f g 
a 2 NaN NaN 
e NaN 1 1 

Выше для интуиции. Это можно обернуть в выражении с одной строкой генератора следующим образом:

pd.Series(Counter((bg[i][0], bg[i][1]) for bg in bigrams for i in range(2))).unstack() 
0

Вы можете использовать Counter из пакета коллекций. Обратите внимание, что я изменил содержимое списка как кортежи, а не списки. Это связано с тем, что клавиши счетчика (например, клавиши dict) должны быть хешируемыми.

from collections import Counter 

l = [('a','b'),('e', 'f')] 
index, cols = zip(*l) 
df = pd.DataFrame(0, index=index, columns=cols) 
c = Counter(l) 

for (i, c), count in c.items(): 
    df.loc[i, c] = count 
Смежные вопросы