为了账号安全,请及时绑定邮箱和手机立即绑定

在 Pandas DataFrame 中分配新列时出现令人费解的 KeyError

在 Pandas DataFrame 中分配新列时出现令人费解的 KeyError

梵蒂冈之花 2021-09-01 14:15:50
我正在做一些自然语言处理,我有一个 MultiIndexed DataFrame 看起来像这样(除了实际上大约有 3,000 行):                             Title                                              N-gramsPeriod  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 上。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 402 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信