我有一个像这样的二元组列表:
[['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
答案 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