【问题标题】:Run into "KeyError: 2L" assigning to dictionary遇到分配给字典的“KeyError:2L”
【发布时间】:2017-05-05 20:55:27
【问题描述】:

我有一个 pandas 数据框,我正在尝试将每个 acct_id_adj 号码添加到字典中,并通过注释搜索与该 ID 关联的所有电话号码。

Example of the dataframe
Index    RowNum    acct_id_adj    NOTE_DT    NOTE_TXT
0        1  A20000000113301111        5/2/2017  t/5042222222 lm w/ 3rd jn
1        2  A20000000038002222        5/4/2017        OB CallLeft Message
3        4  A20000000107303333        5/4/2017  8211116411 FOR $18490 MLF


import pandas
import re
PhNum = pandas.read_csv('C:/PhoneNumberSearch.csv')
PhNum = PhNum[PhNum['NOTE_TXT'].notnull()]

D = {}
#for i in xrange(PhNum.shape[0]):
for i in xrange(3):
    ID = PhNum['acct_id_adj'][i]
    Note = re.sub(r'\W+', ' ', PhNum['NOTE_TXT'][i])
    print(Note)
    Numbers = [int(s) for s in Note.split() if s.isdigit()]
    print(Numbers)
    for j in xrange(len(Numbers)):
        if Numbers[j] > 1000000000:
            D[ID] = Numbers[j]

print(D)

Out = pandas.DataFrame(D.items(), columns=['acct_id_adj', 'Phone_Number'])

但是,在第三行,我一直在 ID = PhNum['acct_id_adj'][i] 处遇到错误“KeyError: 2L”。找不到好的文档,无法弄清楚为什么问题会等到那时才出现。

感谢所有帮助,让我了解可能导致此错误的原因,或者我是否以错误的方式思考字典。

【问题讨论】:

  • 请发布完整的回溯。
  • 也许是因为它正在寻找PhNum['acct_id_adj'][2],但它把这些数字中的第二个作为索引列中的内容?我注意到您的行编号为 0、1 和 3,所以这可能是问题所在。

标签: python dictionary keyerror


【解决方案1】:

分析:

看来你的PhoneNumberSearch.csv文件格式错误,如果是,pandas.read_csv会使用第一列作为索引,例如:

如果 csv 文件是:

Index,RowNum,acct_id_adj,NOTE_DT,NOTE_TXT
0,1,A20000000113301111,5/2/2017,t/5042222222 lm w/ 3rd jn,
1,2,A20000000038002222,5/4/2017,OB CallLeft Message,
3,4,A20000000107303333,5/4/2017,8211116411 FOR $18490 MLF,

PhNum 将是这样的:

    Index   RowNum  acct_id_adj NOTE_DT NOTE_TXT
0   1   A20000000113301111  5/2/2017    t/5042222222 lm w/ 3rd jn   NaN
1   2   A20000000038002222  5/4/2017    OB CallLeft Message NaN
3   4   A20000000107303333  5/4/2017    8211116411 FOR $18490 MLF   NaN

如您所见,没有index 2 而是3,这就是ID = PhNum['acct_id_adj'][2] 会引发错误的原因。

解决方案:

你能做什么你可以考虑index_col=False强制pandas使用第一列作为索引,参考official doc

PhNum = pandas.read_csv('C:/PhoneNumberSearch.csv',index_col=False)

PhNum 会给你正确的index

    Index   RowNum  acct_id_adj NOTE_DT NOTE_TXT
0   0   1   A20000000113301111  5/2/2017    t/5042222222 lm w/ 3rd jn
1   1   2   A20000000038002222  5/4/2017    OB CallLeft Message
2   3   4   A20000000107303333  5/4/2017    8211116411 FOR $18490 MLF

【讨论】:

  • 我实际上并不需要索引,但仍然喜欢像这样将它们用于故障排除目的。我最终只是重置了索引,然后修复了关键错误。 PhNum = PhNum[PhNum['NOTE_TXT'].notnull()].reset_index()
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
相关资源
最近更新 更多