将bi-gram添加到pandas数据帧中

时间:2016-03-01 16:19:25

标签: python pandas

我有一个像这样的二元组列表:

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

现在我想将这些bigrams添加到DataFrame中,其频率如下:

  b  f
a|1  0
e|0  1

我尝试使用以下代码执行此操作,但这会引发错误,因为索引尚未存在。对于真正的大数据,有没有快速的方法来做到这一点? (比如20万双胞胎)

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 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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