Run into "KeyError: 2L" assigning to dictionary

Run into "KeyError: 2L" assigning to dictionary

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

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 490 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"。没有找到好的文档,也无法弄清楚为什么问题会等到那时才出现。

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

分析:

看来您的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 490 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 490 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 490 MLF