Python 3:使用数据框的字典时出现KeyError 0

时间:2018-07-27 17:55:29

标签: python pandas

使用以下代码,我试图将n-DataFrames插入MSSQL表。

return_none

for file in os.listdir(): print('# Inserting ' + file + ' . . .') df = pd.read_csv(file) df = df.fillna('NULL') if(len(df)>1): dfs = partDF(df , lim) for k in dfs.keys(): print('\t' + str(int(k.split('t')[1])+1) + ' / ' + str(len(dfs.keys()))+ '\t') aux = dfs[k] insert2SQL(aux, table) del(aux) print(' OK :)') del(df, dfs) 函数将数据帧拆分为较小的数据帧,以使每个数据帧的长度均不超过1000行。这些数据帧在字典中返回,字典的键名为t0,t1,t1 ... tn。
请注意,为了安全起见,我直接从partDF()方法中使用了键名。

上面的代码在循环中插入第一个数据帧后,引发 Keyerror 0

dict.keys()

但是,当我执行下面的代码只是在打印数据帧的标题时,没有遇到这样的错误:

    KeyError                                  Traceback (most recent call last)
<ipython-input-4-0e1d02aa1939> in <module>()
      8                         print('\t' + str(int(k.split('t')[1])+1) + ' / ' + str(len(dfs.keys()))+ '\t')
      9                         aux = dfs[k]
---> 10                         insert2SQL(aux, table)
     11                         del(aux)
     12                 print(' OK :)')

<ipython-input-2-fd6c30d5a003> in insert2SQL(tablilla, sqlTab)
     27         vals = list()
     28         for field in tablilla.columns:
---> 29                 if(type(tablilla[field][0]) == str):
     30                         vals.append(True)
     31                 else:

c:\python36\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    621         key = com._apply_if_callable(key, self)
    622         try:
--> 623             result = self.index.get_value(self, key)
    624 
    625             if not is_scalar(result):

c:\python36\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   2558         try:
   2559             return self._engine.get_value(s, k,
-> 2560                                           tz=getattr(series.dtype, 'tz', None))
   2561         except KeyError as e1:
   2562             if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 0

我不明白发生了什么,如果有人可以帮助我,我会很高兴。

PS。我之所以没有发布for file in os.listdir(): df = pd.read_csv(file) df = df.fillna('NULL') if(len(df)>1): dfs = partDF(df , lim) for k in dfs.keys(): aux = dfs[k] print('\t\t\t\tOriginal length : ' + str(len(aux))) print(aux.head(10)) #insert2SQL(aux, table) del(aux) del(df, dfs) 代码,是因为我认为从这两个代码段中可以很明显地看出这不是错误的原因。

PS2。 insert2SQL代码:

partDF()

已编辑:

在您说完这些话之后,我尝试查看您的评论,发现我的错误是因为我总是尝试比较每个数据帧的第一行,而忘记了在拆分大数据帧后,大熊猫保留了索引行。解决方案是将df.reset_index()应用于我发送到我的insert2SQL()函数的每个数据帧。

非常感谢!

PS。只要您的评论对我有用,有什么方法可以投票赞成? 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

表是否在某处初始化?您需要对其进行初始化。

更新:在函数插入中,是否每次循环迭代时实际上都存在以下内容? -tablilla [field] [0] -textFields [field] -tablilla.loc [r,field]

我建议您逐一注释掉每个for循环,看看是什么部分导致了错误。