Я видел несколько похожих ответов относительно KeyErrors от использования groupby в DataFrame.Однако их решения и объяснения не соответствуют моей проблеме должным образом.
Я нахожу это особенно странным, потому что не могу воспроизвести исключение при тестировании сценария в консоли Python, подавая его с помощью кодапострочно.Групповая попытка работает нормально при тестировании с примерами из одной записи.
Кроме того, я ранее использовал тот же сценарий для json-файла аналогичного формата, хотя и со значительно меньшим размером данных - и он работал без проблем .
Чтоя пытаюсь это сделать?
У меня есть вложенная строка json, которую я пытаюсь отформатировать с использованием DataFrame, подсчитать, сколько раз конкретное значение появляется в каждом столбце.
JSON, когда он проходит через конвертер, выглядит так:
action,timestamp,campaign_id,title,type,url
open,2019-02-08T08:57:59+00:00,192a39071b,[CAMPAIGN TITLE],,
sent,2019-02-08T07:00:00+00:00,192a39071b,[CAMPAIGN TITLE],regular,
sent,2019-02-07T11:00:00+00:00,2159592071,[CAMPAIGN TITLE],regular,
open,2019-02-07T08:33:44+00:00,214d84380b,[CAMPAIGN TITLE],,
open,2019-02-07T08:33:19+00:00,56ab3a5934,[CAMPAIGN TITLE],,
open,2019-02-07T08:32:33+00:00,811ac6cae3,[CAMPAIGN TITLE],,
sent,2019-02-07T02:45:00+00:00,214d84380b,[CAMPAIGN TITLE],regular,
sent,2019-02-05T02:30:00+00:00,56ab3a5934,[CAMPAIGN TITLE],regular,
(в случае, если это уместно - JSON извлекается непосредственно из API и не записывается в CSV или что-либо еще)
В частности, я хочу подсчитать, сколько раз слова "open" и "sent" появляются под столбцом для "action".
Это соответствующий фрагмент кода, который я использовал:
dretrieved = json.loads(response.text)
dframed = pandas.DataFrame(dretrieved['activity'])
actionssummary = dframed.groupby('action').size()
try: opencount = actionssummary['open']
except:
opencount = 0
try: sentcount = actionssummary['sent']
except:
sentcount = 0
И это был след:
Traceback (most recent call last):
File "MC_member_data_list_api.py", line 92, in <module>
actionssummary = dframed.groupby('action').size()
File "C:\Users\username\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\generic.py", line 7622, in groupby
observed=observed, **kwargs)
File "C:\Users\username\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\groupby\groupby.py", line 2110, in groupby
return klass(obj, by, **kwds)
File "C:\Users\username\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\groupby\groupby.py", line 360, in __init__
mutated=self.mutated)
File "C:\Users\username\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\groupby\grouper.py", line 578, in _get_grouper
raise KeyError(gpr)
KeyError: 'action'
Кто-нибудь знает, что происходит?
РЕДАКТИРОВАТЬ : Следуя комментарию suvayu о гейзенгах, вызванном неожиданным или искаженным вводом, я добавил в свой код исключительный проход, как показано ниже, чтобы он записывал ноль (0) для этогозапись пользователя и перейти к следующему:
dframed = pandas.DataFrame(dretrieved['activity'])
# identify action portion of the json (go to next if error)
try: actionssummary = dframed.groupby('action').size()
except:
pass
# identify count of opens
try: opencount = actionssummary['open']
except:
opencount = 0