Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提取JSON | API |数据帧_Python_Json_Python 3.x_Pandas_Dictionary - Fatal编程技术网

Python 提取JSON | API |数据帧

Python 提取JSON | API |数据帧,python,json,python-3.x,pandas,dictionary,Python,Json,Python 3.x,Pandas,Dictionary,我使用的是Facebook API(v2.10),我已经提取了我需要的数据,其中95%是完美的。我的问题是'actions'度量,它作为另一个字典列表中的字典返回 目前,所有数据都在一个数据框中,“操作”列是一个字典列表,其中包含当天的每个操作 { "actions": [ { "action_type": "offsite_conversion.custom.xxxxxxxxxxx", "value": "7"

我使用的是Facebook API(v2.10),我已经提取了我需要的数据,其中95%是完美的。我的问题是'actions'度量,它作为另一个字典列表中的字典返回

目前,所有数据都在一个数据框中,“操作”列是一个字典列表,其中包含当天的每个操作

{
    "actions": [
        {
            "action_type": "offsite_conversion.custom.xxxxxxxxxxx",
            "value": "7"
        },
        {
            "action_type": "offsite_conversion.custom.xxxxxxxxxxx",
            "value": "3"
        },
        {
            "action_type": "offsite_conversion.custom.xxxxxxxxxxx",
            "value": "144"
        },
        {
            "action_type": "offsite_conversion.custom.xxxxxxxxxxx",
            "value": "34"
        }]}
所有这些都显示在数据框内的一个单元格(行)中

最好的方法是什么:

  • 获取操作类型,创建新列并使用“操作类型”作为列名
  • 在此列下列出正确的值
它看起来像JSON,但当我查看类型时,它是一个panda系列(存储为对象)

对于那些愿意帮助的人(谢谢你,我非常感谢)-你能为我指出正确的材料方向,我会自己阅读并解决它(我不完全确定要寻找什么),或者如果你认为这是一个简单的问题,请向我解释你是如何以及为什么以这种方式解决的。不要只想要答案

我尝试了以下方法(在朋友的帮助下),效果不错,但在脚本中运行时遇到了一些问题。IE:如果它在更大的代码块中运行,我会得到以下错误:

for i in range(df.shape[0]):
    line = df.loc[i, 'Conversions']
    L = ast.literal_eval(line)
    for l in L:
        cid = l['action_type']
        value = l['value']
        df.loc[i, cid] = value
如果我将DF保存为csv,请使用
pd.read\u csv
…调用它。它会正确执行,但不会在脚本中执行。不知道为什么

错误:

ValueError: malformed node or string: [{'value': '1', 'action_type': 'offsite_conversion.custom.xxxxx}]
任何帮助都将不胜感激

谢谢, 阿德里安你可以使用:

您可以使用:

您可以使用
df.join(pd.DataFrame(df['Conversions'].tolist()).pivot(columns='action\u type',values='value').reset\u index(drop=True))

说明:
df['Conversions'].tolist()
返回字典列表。然后使用pd.DataFrame将此列表转换为数据帧。然后,可以使用将表格旋转为所需的形状

最后,您可以将表与原始数据帧连接起来。请注意,这仅在DataFrame的索引为默认值(即从0开始的整数)时才有效。如果不是这样,您可以改为:

df2=pd.DataFrame(df['Conversions'].tolist()).pivot(columns='action'u type',values='value')。重置索引(drop=True)
对于df2.0列中的列:
df[col]=df2[col]

您可以使用
df.join(pd.DataFrame(df['Conversions'].tolist()).pivot(columns='action''type',values='value')。reset_index(drop=True))

说明:
df['Conversions'].tolist()
返回字典列表。然后使用pd.DataFrame将此列表转换为数据帧。然后,可以使用将表格旋转为所需的形状

最后,您可以将表与原始数据帧连接起来。请注意,这仅在DataFrame的索引为默认值(即从0开始的整数)时才有效。如果不是这样,您可以改为:

df2=pd.DataFrame(df['Conversions'].tolist()).pivot(columns='action'u type',values='value')。重置索引(drop=True)
对于df2.0列中的列:
df[col]=df2[col]

这是否只是一个单元格,也就是说,你有一整列这些单元格,你想以某种方式扩展它们?正确,这一列是214个单独的单元格,基于当天的动作、广告组、年龄、性别等。我想扩展单独的动作,并为它们创建独特的列。这是否只是一个单元格,也就是说,你有一整列这些,你想以某种方式扩展它们吗?正确,这一列是214个单独的单元格,基于当天的动作、广告组、年龄、性别等。我想扩展单独的动作,并为它们创建独特的列谢谢,安迪!谢谢你的帮助。我尝试使用下面的代码复制上述内容:
d=df['Conversions']
pd.io.json.json\u normalize(d,record\u path=“actions”)
返回了以下错误:TypeError:list索引必须是整数或片,而不是str。尽管它看起来像json,但该类型实际上返回了一个熊猫系列(作为对象),除非我遗漏了什么。@AdrianC是这样的:
df.actions.apply(lambda x:pd.Series({a[“action\u type”]:a[“value”]代表a in x[“actions”]}))
你想要的吗?再次感谢安迪!我试过了,但它总是返回同样的错误。”TypeError:列表索引必须是整数或片,而不是str'。但是,您上面所做的很接近,我需要它们作为列运行,其值在条目dicts或string(看起来像dicts)下面?如果是后者,那么您可以使用
df.actions.apply(ast.literal\u eval.apply)点击列…
它们看起来像dict,但是从我得到的所有错误来看,我会说以下错误将确认的字符串:
ValueError:格式错误的节点或字符串:[{'value':'1','action\u type':'offsite\u conversion.custom.xxxxxxxx'}
谢谢你,安迪!感谢你的帮助。我已经尝试使用以下方法复制上述内容:
d=df['Conversions']
pd.io.json.json\u normalize(d,record\u path=“actions”)
返回了以下错误:TypeError:列表索引必须是整数或片,而不是str。尽管它看起来像JSON,但该类型实际上返回了一个熊猫系列(作为对象),除非我遗漏了什么。@AdrianC是这样的:
df.actions.apply(lambda x:pd.series({a[“action\u type”]:a[“value”]代表x[“actions”])))
你想要的?谢谢(再次)Andy!我尝试了这个,但它总是返回相同的错误。“TypeError:列表索引必须是整数或切片,而不是str”。但是,你上面所做的很接近,而不是以行的形式运行,我需要它们以列的形式运行,其值位于条目dicts或字符串(看起来像dicts)下方如果是后者,那么您可以使用
df.actions.apply(ast.literal\u eval).apply…
点击该列,它们看起来像dicts,但是从我得到的所有错误来看,我会说字符串
In [11]: d  # e.g. dict from json.load OR instead pass the json path to json_normalize
Out[11]:
{'actions': [{'action_type': 'offsite_conversion.custom.xxxxxxxxxxx',
   'value': '7'},
  {'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 'value': '3'},
  {'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 'value': '144'},
  {'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 'value': '34'}]}

In [12]: pd.io.json.json_normalize(d, record_path="actions")
Out[12]:
                             action_type value
0  offsite_conversion.custom.xxxxxxxxxxx     7
1  offsite_conversion.custom.xxxxxxxxxxx     3
2  offsite_conversion.custom.xxxxxxxxxxx   144
3  offsite_conversion.custom.xxxxxxxxxxx    34