在python中创建新列时出现KeyError错误
我试图在python pandas中创建一个新的列,但我不断得到一个(不稳定的)重复出现的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
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