我正在做一些自然语言处理,我有一个 MultiIndexed DataFrame 看起来像这样(除了实际上大约有 3,000 行):
Title N-grams
Period Date
2015-01 2015-01-01 22:00:10 SIRF: Simultaneous Image Registration and Fusi... [@SENTBEGIN paper, paper propose, propose nove...
2015-01-02 16:54:13 Generic construction of scale-invariantly coar... [@SENTBEGIN encode, encode temporal, temporal ...
2015-01-04 00:07:00 Understanding Trajectory Behavior: A Motion Pa... [@SENTBEGIN mining, mining underlie, underlie ...
2015-01-04 09:07:45 Hostile Intent Identification by Movement Patt... [@SENTBEGIN the, the recent, recent year, year...
2015-01-04 14:35:58 A New Method for Signal and Image Analysis: Th... [@SENTBEGIN brief, brief review, review provid...
我想要做的是计算每个 n-gram 在每个月出现的次数(因此是第一个索引,“Period”)。这样做相当简单,如果很耗时(并且因为“N-grams”列中的每个单元格都是一个列表,我不确定可以做多少来加速它)。我使用以下代码创建了一个新的 DataFrame 来保存计数:
# Create the frequencies DataFrame.
period_index = ngrams.index.unique(level = "Period")
freqs = DataFrame(index = period_index)
# Count the n-grams in each period.
for period in period_index:
for ngrams_list in ngrams.loc[period, "N-grams"]:
for ngram in ngrams_list:
if not ngram in freqs.columns:
freqs[ngram] = 0
freqs.loc[period, ngram] += 1
逻辑很简单:如果有问题的 n-gram 已经被看到(在“freqs”中有一个列),将计数增加 1。如果没有看到,创建一个新的 0 列对于那个 n-gram,然后像往常一样递增。在绝大多数情况下,这工作正常,但对于一小部分 n-gram,当循环遇到增量线时,我会收到此错误:
KeyError: u'the label [7 85.40] is not in the [index]'
(抱歉,缺少正确的堆栈跟踪——我在 Zeppelin Notebook 中执行此操作,而 Zeppelin 没有提供正确的堆栈跟踪。)
更多的调试表明,在这些情况下,新列的创建会以静默方式失败(也就是说,它不起作用,但也不会返回异常)。
可能值得注意的是,在早期版本的代码中,我使用“loc”直接分配给新创建的列中的单元格,而不是先创建列,如下所示:
if not ngram in freqs.columns:
freqs.loc[period, ngram] = 1
我改变了这一点,因为它通过将那个 n-gram 的 NaN 分配给所有其他时期引起了问题,但是直接分配阻塞在与新代码完全相同的 n-gram 上。
相关分类