Python 提取JSON | API |数据帧
我使用的是Facebook API(v2.10),我已经提取了我需要的数据,其中95%是完美的。我的问题是'actions'度量,它作为另一个字典列表中的字典返回 目前,所有数据都在一个数据框中,“操作”列是一个字典列表,其中包含当天的每个操作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"
{
"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"
}]}
所有这些都显示在数据框内的一个单元格(行)中
最好的方法是什么:
- 获取操作类型,创建新列并使用“操作类型”作为列名
- 在此列下列出正确的值
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