KeyError при создании нового столбца в пандах Python - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь создать новый столбец в python pandas и получаю (неустойчивый) повторяющийся KeyError.Раздел сценария очень прост, поэтому я не уверен, что может быть причиной ошибки, поскольку ни один из столбцов в наборе данных не имеет одинакового имени.

Моя цель - создать новый столбец и добавить его кфрейм данных, который содержит новые переводы содержимого столбца ticket_contents.Вот пример данных:

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'

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Ошибка возникает по адресу:

test_data['translated_descriptions'].copy = translated_description

Что на самом деле содержит:

  • test_data['translated_descriptions'].copy - это ссылка на copy метод еще несуществующий столбец.
  • ... = translated_description - вы пытаетесь заменить список этой ссылкой.

Если вы хотите создать новый столбец, напишите просто:

test_data['translated_descriptions'] = translated_description

Редактировать

Если вы хотите избавиться от ошибки, упомянутой в комментарии, тогда:

  • Начните с копирования кадра данных: df2 = test_data.copy() (invoke * 1026)* метод целого DataFrame, а не его столбца).
  • Затем используйте df2 - новый DataFrame.

И пару советов, какулучшить вашу программу:

Определить translator вне функции перевода:

translator = Translator(from_lang = from_lang, to_lang = to_lang)

Затем определить функцию перевода как:

def test_translation(contents):
    return translator.translate(contents)

И затем новый столбецможет быть создан просто:

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)

NПримечание:

  • Первая инструкция читает DataFrame из CSV-файла и сохраняет его в переменной test_data.
  • Затем вы создаете следующий DataFrame (фактически представление * 1058).* существующий DataFrame) и присвоить его той же переменной.

В результате:

  • DataFrame previous где-то существует, но теперьнедоступен.
  • У вас есть доступ только к представлению, созданному со второй инструкцией.
  • И вот почему вы получаете упомянутую ошибку.

Вывод: отбросьте вторую инструкцию.Достаточно иметь один DataFrame.

0 голосов
/ 26 февраля 2019

Я согласен с комментариями о том, что вы не должны перебирать данные.Вы должны вычислить все значения в списке, массиве или серии и назначить их все сразу.

Однако ваша ошибка исходит из этой строки:

test_data['translated_descriptions'].copy = translated_description

перезаписать атрибут / метод copy серии test_data['translated_descriptions'].Поскольку эта серия еще не существует, вы получаете ошибку.

Чтобы создать новый столбец с вашей последовательностью значений, я бы сделал следующее:

test_data = test_data.assign(translated_descriptions=translated_description_values)
...