在python中创建新列时出现KeyError错误

在python中创建新列时出现KeyError错误,python,pandas,keyerror,Python,Pandas,Keyerror,我试图在python pandas中创建一个新的列,但我不断得到一个(不稳定的)重复出现的KeyError。脚本的这一部分非常简单,因此我不确定是什么导致了错误,因为数据集中的所有列都没有相同的名称 我的目标是创建一个新列,并将其附加到包含列内容的新翻译的数据框中。 这是一个数据样本 25483 0 outstanding 0 Los-Angeles e-payment delayed Ticket 1/7/19 7:54 39363 0 outstanding 0

我试图在python pandas中创建一个新的列,但我不断得到一个(不稳定的)重复出现的KeyError。脚本的这一部分非常简单,因此我不确定是什么导致了错误,因为数据集中的所有列都没有相同的名称

我的目标是创建一个新列,并将其附加到包含列内容的新翻译的数据框中。 这是一个数据样本

25483   0   outstanding 0   Los-Angeles e-payment   delayed Ticket  1/7/19 7:54
39363   0   outstanding 0   Los-Angeles e-payment   delayed Ticket  1/7/19 7:54
83584   0   outstanding 6   Los-Angeles e-payment   delayed Ticket  1/7/19 7:54
34537   0   outstanding 7   Los-Angeles e-payment   lost    Ticket  1/7/19 7:53



colnames = ['id', 'ln_id', 'status', 
'number_outstanding', 'country', 'subject', 'ticket_contents', 'subtopic', 
'date']
test_data = pandas.read_csv(test_data, names = colnames, encoding 
= 'utf-8')
test_data = pandas.DataFrame(test_data)

translated_description = []

from_lang = 'tl'
to_lang = 'en-us'

def test_translation(contents):
    translator = Translator(from_lang = from_lang, to_lang = to_lang)
    translation = translator.translate(contents)
    translated_description.append(translation)
    #print(translated_description)


for contents, row in test_data.iterrows():
    contents = test_data.ticket_contents.iloc[contents -1]
    test_translation(contents)

test_data['translated_descriptions'].copy = translated_description
以下是错误输出:

KeyError Traceback (most recent call last)
<ipython-input-70-55e39cf5e328> in <module>()
     16     test_translation(contents)
     17 
---> 18 test_data['translated_descriptions'].copy = translated_description
     19 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/frame.pyc in __getitem__(self, key)
   1962             return self._getitem_multilevel(key)
   1963         else:
-> 1964             return self._getitem_column(key)
   1965 
   1966     def _getitem_column(self, key):

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/frame.pyc in _getitem_column(self, key)
   1969         # get column
   1970         if self.columns.is_unique:
-> 1971             return self._get_item_cache(key)
   1972 
   1973         # duplicate columns & possible reduce dimensionality

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/generic.pyc in _get_item_cache(self, item)
   1643         res = cache.get(item)
   1644         if res is None:
-> 1645             values = self._data.get(item)
   1646             res = self._box_item_values(item, values)
   1647             cache[item] = res

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/internals.pyc in get(self, item, fastpath)
   3588 
   3589             if not isnull(item):
-> 3590                 loc = self.items.get_loc(item)
   3591             else:
   3592                 indexer = np.arange(len(self.items))[isnull(self.items)]

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/indexes/base.pyc in get_loc(self, key, method, tolerance)
   2442                 return self._engine.get_loc(key)
   2443             except KeyError:
-> 2444                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2445 
   2446         indexer = self.get_indexer([key], method=method, tolerance=tolerance)

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5280)()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5126)()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20523)()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20477)()

KeyError: u'translated_descriptions'
keyrerror回溯(最近一次调用)
在()
16测试翻译(目录)
17
--->18测试数据[“翻译的描述”]。副本=翻译的描述
19
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/frame.pyc in___getitem___(self,key)
1962返回自我。\u获取项目\u多级(键)
1963年其他:
->1964返回自我。\u获取项目\u列(键)
1965
1966 def_getitem_列(自身,键):
/_getitem_列中的Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/frame.pyc(self,key)
1969年#获得专栏
1970如果self.columns.u是唯一的:
->1971返回自我。获取项目缓存(密钥)
1972
1973#重复列和可能的降维
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/generic.pyc in_get_item_cache(self,item)
1643 res=cache.get(项)
1644如果res为无:
->1645 values=self.\u data.get(项目)
1646 res=自身。_框_项_值(项,值)
1647缓存[项目]=res
/get中的Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/internals.pyc(self、item、fastpath)
3588
3589如果不为空(项目):
->3590 loc=自身物品。获取loc(物品)
3591其他:
3592 indexer=np.arange(len(self.items))[isnull(self.items)]
/get_loc中的Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/index/base.pyc(self、key、method、tolerance)
2442自动返回发动机。获取锁定位置(钥匙)
2443键错误除外:
->2444返回self.\u引擎。获取位置(self.\u可能\u投射\u索引器(键))
2445
2446 indexer=self.get_indexer([key],method=method,tolerance=tolerance)
pandas/_libs/index.pyx在pandas中。_libs.index.IndexEngine.get_loc(pandas/_libs/index.c:5280)()
pandas/_libs/index.pyx在pandas中。_libs.index.IndexEngine.get_loc(pandas/_libs/index.c:5126)()
pandas/_libs/hashtable\u class_helper.pxi在pandas._libs.hashtable.PyObjectHashTable.get_项(pandas/_libs/hashtable.c:20523)()
pandas/_libs/hashtable\u class_helper.pxi在pandas._libs.hashtable.PyObjectHashTable.get_项中(pandas/_libs/hashtable.c:20477)()
KeyError:u“已翻译的描述”

我同意您不应该遍历数据帧的评论。您应该将所有值计算到一个列表、数组或序列中,并一次将它们全部赋值

但是,您的错误来自这一行:

test_data['translated_descriptions'].copy = translated_description
它所做的是覆盖
test\u数据['translated\u descriptions']
系列的
copy
属性/方法。因为那个系列还不存在,所以会出现一个错误

要使用您的值序列创建一个新列,我将执行以下操作:

test_data = test_data.assign(translated_descriptions=translated_description_values)
错误发生在:

test_data['translated_descriptions'].copy = translated_description
它实际上包含什么:

  • test_data['translated_descriptions'].copy
    -是对
    copy
    方法的引用,但不存在
  • …=翻译的描述
    -您试图将列表替换为 这个参考
如果要创建新列,只需编写:

test_data['translated_descriptions'] = translated_description
编辑 如果要消除注释中提到的错误,请执行以下操作:

  • 从复制数据帧开始:
    df2=test\u data.copy()
    (调用整个数据帧的
    copy
    方法,而不是它的列)
  • 然后使用新的数据帧
    df2
以及一些如何改进程序的提示:

test_data = pandas.read_csv(test_data, names = colnames,
    encoding = 'utf-8')
test_data = pandas.DataFrame(test_data)
在翻译功能之外定义
translator

translator = Translator(from_lang = from_lang, to_lang = to_lang)
然后将翻译功能定义为:

def test_translation(contents):
    return translator.translate(contents)
然后可以创建新的colun,如下所示:

test_data['translated_descriptions'] = \
    test_data.ticket_contents.apply(test_translation)
没有任何中间列表

还可以查看程序的以下片段:

test_data = pandas.read_csv(test_data, names = colnames,
    encoding = 'utf-8')
test_data = pandas.DataFrame(test_data)
请注意:

  • 第一条指令从CSV文件读取数据帧并将其保存 在
    test_data
    变量下
  • 然后创建下一个数据帧(实际上是现有数据帧的视图) DataFrame),并将其分配给同一个变量
结果是:

  • 上一个数据帧存在于某个地方,但现在无法访问
  • 您只能访问使用第二条指令创建的视图
  • 这就是为什么会出现上述错误
结论:放弃第二条指令。有一个就足够了
DataFrame。

您应该提供来自
测试数据的代码格式的示例。您不应该修改正在迭代的内容。请提供输入和输出示例,以便清楚地了解您想要实现的目标。我以为这就是我正在做的。我在循环之前创建了空列表。然后我将结果附加到列表中。然后在所有的翻译都在列表中之后,也就是我将其添加到数据帧的时候。有更好的方法吗?@chaimocha我真的不能理解你的代码b/c,它不可复制。但这是一个侧面/优化问题。按照我答案末尾的建议解决方案进行操作,如果它引发的错误与我最初遇到的错误相同,但我添加了“.copy”以绕过错误
A值为tr