我已经在DataFrame中使用groupby看到了一些有关KeyError的类似答案。但是,他们的解决方案和解释与我的问题不符。
我发现这特别奇怪,因为在Python控制台中测试脚本时,无法通过逐行输入代码来复制该异常。在通过一个示例进行测试时,groupby尝试可以正常工作。
另外,我之前版本曾将相同的脚本用于格式相似的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或其他任何形式编写的)
具体来说,我想计算“打开”和“已发送”出现在“操作”列下的次数。
这是我使用的代码的相关代码段:
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对由意外或格式错误的输入引起的Heisenbug进行评论之后,我在代码中添加了一个Exception-pass,如下所示,以便该用户输入的内容记录为零(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